利用支付宝短信服务接口 实现手机号 验证码登录Demo

一、首先需要去阿里云注册账号并登录

二、注册阿里云的短信服务 会有100条免费短信 获取自己的AccessKey(accessKeyId,accessKeySecret)

三、在阿里云短信服务 注册短信的 签名  和 模板

阿里云短信服务参考地址:https://www.aliyun.com/ss/?k=%E7%9F%AD%E4%BF%A1%E6%9C%8D%E5%8A%A1&accounttraceid=b95a6b72bbdb45f6942490006a7dd4ebvvkl

 maven

      <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.0.8</version></dependency><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-dysmsapi</artifactId><version>1.1.0</version></dependency>

 

 以下为实现的代码demo 框架为SSM

 NoteController

package com.yannis.controller;import com.alibaba.fastjson.support.spring.FastJsonJsonView;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.google.gson.internal.bind.JsonAdapterAnnotationTypeAdapterFactory;
import com.yannis.json.AjaxJson;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Timer;
import java.util.TimerTask;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** @Author: ysw* @Date: 2020/9/7 10:59*/
@Controller
@RequestMapping("/note")
public class NoteController {//产品名称:云通信短信API产品,开发者无需替换static final String product = "Dysmsapi";//产品域名,开发者无需替换static final String domain = "dysmsapi.aliyuncs.com";// TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)static final String accessKeyId = "";static final String accessKeySecret = "";@RequestMapping("adduser")public String adduser(HttpServletRequest request,HttpServletResponse response){request.setAttribute("view","1");return "/adduser";}@RequestMapping("/sendNote")@ResponseBodypublic AjaxJson sendNote(String phone, HttpServletRequest res, HttpServletResponse req){AjaxJson j =new AjaxJson();LinkedHashMap<String,Object> hashMap = new LinkedHashMap<>();//发短信try {SendSmsResponse   response = sendSms(phone,"","");System.out.println("短信接口返回的数据----------------");System.out.println("Code=" + response.getCode());System.out.println("Message=" + response.getMessage());System.out.println("RequestId=" + response.getRequestId());System.out.println("BizId=" + response.getBizId());Thread.sleep(3000L);if(response.getCode() != null && response.getCode().equals("OK")) {QuerySendDetailsResponse querySendDetailsResponse = querySendDetails(response.getBizId(),phone);System.out.println("短信明细查询接口返回数据----------------");System.out.println("Code=" + querySendDetailsResponse.getCode());System.out.println("Message=" + querySendDetailsResponse.getMessage());int i = 0;String content="";for(QuerySendDetailsResponse.SmsSendDetailDTO smsSendDetailDTO : querySendDetailsResponse.getSmsSendDetailDTOs()) {System.out.println("SmsSendDetailDTO["+i+"]:");content = smsSendDetailDTO.getContent();System.out.println("Content=" + content);System.out.println("ErrCode=" + smsSendDetailDTO.getErrCode());System.out.println("OutId=" + smsSendDetailDTO.getOutId());System.out.println("PhoneNum=" + smsSendDetailDTO.getPhoneNum());System.out.println("ReceiveDate=" + smsSendDetailDTO.getReceiveDate());System.out.println("SendDate=" + smsSendDetailDTO.getSendDate());System.out.println("SendStatus=" + smsSendDetailDTO.getSendStatus());System.out.println("Template=" + smsSendDetailDTO.getTemplateCode());}System.out.println("TotalCount=" + querySendDetailsResponse.getTotalCount());System.out.println("RequestId=" + querySendDetailsResponse.getRequestId());String yzmFromSms = getYzmFromSms(content);HttpSession session = res.getSession();session.setAttribute("code",yzmFromSms);session.setAttribute("phone",phone);session.setAttribute("msg","验证码发送成功");//定时5分钟删除验证码removeAttrbute(session, "code");removeAttrbute(session, "phone");removeAttrbute(session, "msg");j.setSuccess(true);}} catch (ClientException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}return j;}/*** phone 手机号* singName 申请的签名* templateCode  模板code* *///发送短信public static SendSmsResponse sendSms(String phone,String singName,String templateCode) throws ClientException {//可自助调整超时时间System.setProperty("sun.net.client.defaultConnectTimeout", "10000");System.setProperty("sun.net.client.defaultReadTimeout", "10000");//初始化acsClient,暂不支持region化IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);IAcsClient acsClient = new DefaultAcsClient(profile);//组装请求对象-具体描述见控制台-文档部分内容SendSmsRequest request = new SendSmsRequest();//必填:待发送手机号request.setPhoneNumbers(phone);         //必填:短信签名-可在短信控制台中找到request.setSignName(singName);          //必填:短信模板-可在短信控制台中找到request.setTemplateCode(templateCode);  //可选:模板中的变量替换JSON串,如模板内容为"${code}"时,此处的值为request.setTemplateParam("{'code': '"+randomSix()+"'}");//选填-上行短信扩展码(无特殊需求用户请忽略此字段)//request.setSmsUpExtendCode("验证码");//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者request.setOutId("yourOutId");//hint 此处可能会抛出异常,注意catchSendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);return sendSmsResponse;}//查询发送短信的信息public static QuerySendDetailsResponse querySendDetails(String bizId,String phone) throws ClientException {//可自助调整超时时间System.setProperty("sun.net.client.defaultConnectTimeout", "10000");System.setProperty("sun.net.client.defaultReadTimeout", "10000");//初始化acsClient,暂不支持region化IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);IAcsClient acsClient = new DefaultAcsClient(profile);//组装请求对象QuerySendDetailsRequest request = new QuerySendDetailsRequest();//必填-号码request.setPhoneNumber(phone);//可选-流水号request.setBizId(bizId);//必填-发送日期 支持30天内记录查询,格式yyyyMMddSimpleDateFormat ft = new SimpleDateFormat("yyyyMMdd");request.setSendDate(ft.format(new Date()));//必填-页大小request.setPageSize(10L);//必填-当前页码从1开始计数request.setCurrentPage(1L);//hint 此处可能会抛出异常,注意catchQuerySendDetailsResponse querySendDetailsResponse = acsClient.getAcsResponse(request);return querySendDetailsResponse;}//生成6位验证码public static int  randomSix(){//随机生成六位随机数StringBuffer stringBuffer=new StringBuffer();for (int x=0;x<=5;x++) {int random = (int) (Math.random() * (10 - 1));stringBuffer.append(random);}String string = stringBuffer.toString();System.out.println("生成的六位验证码  :"+Integer.parseInt(string));return Integer.parseInt(string);}//提取6位验证码private String getYzmFromSms(String smsBody) {Pattern pattern = Pattern.compile("\\d{6}");Matcher matcher = pattern.matcher(smsBody);if (matcher.find()) {return matcher.group();}return null;}/*** 设置5分钟后删除session中的验证码* @param session* @param attrName*/private void removeAttrbute(final HttpSession session, final String attrName) {final Timer timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {// 删除session中存的验证码session.removeAttribute(attrName);timer.cancel();}}, 5 * 60 * 1000);}}

 adduser.jsp 登录页面  jquery 换成自己的路径

<%@ page language="java" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>手机号登录</title><style type="text/css">
.main {/*设置外边距,下面有30px距离*/margin: 0px 0px 30px 0px;/*背景色*/background-color: #ffffff;/*字体大小*/font-size: 12px;/*文字颜色*/color: #000000;/*文本对齐方式*/text-align: center;/*垂直对齐方式*/vertical-align: top;/*设置行高*/line-height: 150%;font-family: Arial, Helvetica, sans-serif;
}
/*设置a标签 字体12px 颜色 #0066FF*/
a {font-size: 12px;color: #0066FF; /*#1E33F7*/
}
/*设置未访问的超连接无下划线*/
a:link {text-decoration: none;
}
/*设置访问后的连接颜色为#0066ff 也无下划线*/
a:visited {text-decoration: none;color: #0066FF;
}
/*设置鼠标移到超连接上无下划线颜色为#990099*/
a:hover {text-decoration: none;color: #990099; /*颜色变换*/
}
/*设置选定的超连接无下划线,颜色为#0066ff*/
a:active {text-decoration: none;color: #0066FF;
}/*设置所有td标签*/
td {text-align: left;vertical-align: top;font-size: 12px;
}
/*设置所有的hr标签*/
hr {/*颜色*/color: #cccccc;/*高度*/height: 1px;/*上外边距5px*/margin-top: 5px;/*下外边距5px*/margin-bottom: 5px;/*分隔线如果超出框架部分隐藏*/overflow: hidden;
}
/*设置h1*/
h1 {font-size: 14px;color: #000000;margin-bottom: 5px;font-weight: bold;display: inline;text-align: center;
}#head {/*设置head这个div宽度为100%*/width: 100%;
}.headtab {width: 100%;
}.headta td {/*设置td内边距上10px 右50px 下25px 左135px*/padding: 10px 50px 25px 135px;
}#menu {width: 100%;background-color: #1c3f09; /*设置背景色*/border-top-width: 4px; /*设置上边框宽度4px*/border-top-style: solid; /*设置上边框样式 实线*/border-top-color: #82b211; /*设置上边框的颜色 #82b211*/text-align: center;font-size: 14px;padding: 10px 0px 10px 0px;
}#menu td {text-align: center;
}#menu a {font-size: 14px;color: #ffffff; /*超连接文字颜色*/font-weight: bold; /*超连接字体加粗*/padding: 10px 10px 10px 10px; /*超连接内边距*/
}#menu a:link {text-decoration: none;font-weight: bold;
}#menu a:visited {text-decoration: none;color: #FFFFFF;font-weight: bold;
}#menu a:hover {text-decoration: none;color: #999999; /*颜色变换*/font-weight: bold;
}#menu a:active {text-decoration: none;color: #FFFFFF;font-weight: bold;
}#search {width: 100%;text-align: center;color: #ffffff;font-weight: bold;padding: 5px 0px 5px 0px;background-color: #b6b684;
}.inputtxt {width: 130px;height: 18px;border: 1px solid #999999;
}
/*注册页面content部分整体设计*/
#content {width: 900px;background-color: #fcfdef;border: 1px solid #eeeddb;margin-right: auto;margin-left: auto;
}
/*设置边框*/
.upline {border-bottom-width: 1px;border-bottom-style: dashed;border-bottom-color: #b0bec7;padding-top: 5px;padding-bottom: 5px;margin: 20px;
}
/*设置文本框样式*/
.txtinput {margin-left: 20px;font-size: 15px;width: 200px;height: 25px;border: 1px solid #a4b4bd;
}
/*设置文本域样式*/
.txtarea {margin-left: 20px;font-size: 15px;width: 350px;height: 75px;border: 1px solid #a4b4bd;
}#foot {width: 100%;background-color: #efeedc;margin-top: 15px;
}
</style><script src="../js/jquery.min.js"></script></head>
<body class="main"><div id="content"><form  id="myForm" method="post" onsubmit="return reg(this);"><table  width="850px" border="0" cellspacing="4"><tr><td style="padding: 30px"><h1>手机号登录</h1><table width="100%" border="0" cellspacing="2" class="upline"><tr><td width="30%" style="text-align: right;"><font size="2px">手机号</font></td><td width="30%"><input type="text" name="phone"  id ="phone" class="txtinput" value="${phone}">	</td><td width="40%"><font color="#999999">* 请填写您的手机号&nbsp;&nbsp;&nbsp;							<span id="tise"></span></font></td>				</tr><tr><td style="text-align: right;"><font size="2px">验证码</font></td><td><input type="text" name="code" class="txtinput" id="code" placeholder="请输短信验证码"/></td><td><input id="btn" type="button" onclick="noteTime(this)" value="免费获取验证码"><span id ="error_msg">${msg}</span></td></tr> <%--<tr>--%><%--<td style="text-align: right;"><font size="2px">密码</font></td>--%><%--<td><input type="password" name="password" class="txtinput" id="password" onchange="checkpwd()"/></td>--%><%--<td><font color="#999999">* 密码必须6-18位</font></td>--%><%--</tr>--%><%--<tr>--%><%--<td style="text-align: right;"><font size="2px">重复密码</font></td>--%><%--<td><input type="password" name="repassword"--%><%--class="txtinput"></td>--%><%--<td><font color="#999999">* 两次密码需要一致</font></td>--%><%--<td>&nbsp;</td>--%><%--</tr>	  --%><%----%></table><table width="100%" border="0" cellspacing="4"><tr><td width="51%" style="text-align:right"><input id="sub" type="button" value="确定"><FONT face="宋体">&nbsp;&nbsp;&nbsp;&nbsp;</FONT><td width="49%" >	<INPUT type="button" onclick="history.go(-1)" value="返回" /> <spanid="Label1"> </span></td></tr>		</table></form></div><script>$(function () {var view = "${view}";if (view == "1"){var obj = $("#btn");settime(obj);}});function reg(form) {if (form.phone.value == "") {alert("用户不能为空!");return false;} else if (form.password.value == "") {alert("密码不能为空!");return false;} else if (form.repassword.value == "") {alert("确认密码不能为空!");return false;}else if (form.code.value == "") {alert("验证码不能为空!");return false;}  else if (form.repassword.value != form.password.value ) {alert("两次密码不相同!");return false;} else if(!checkpwd()){return false;} else if(!confirm('注册信息确认提交?')){return false;}}//验证密码位数function checkpwd() {var check;var reg = /[^A-Za-z0-9_]+/;var regs = /^[a-zA-Z0-9_\u4e00-\u9fa5] + $ /;var password = document.getElementById("password").value;if (password.length < 6 || password.length > 18 || regs.test(password)) {alert("密码输入不合法,请重新输入!");document.getElementById("password").focus();check = false;} else {check = true;}return check;}</script><script>//定时60秒重新发送var countdown=60;function noteTime(){var phone = $("#phone").val();if (phone!=""){$.ajax({type:'post',url:"${pageContext.request.contextPath}/note/sendNote?phone="+phone,dataType: "json",success: function(data){window.location.href = "${pageContext.request.contextPath}/note/adduser";}});}else{alert("请输入手机号");}}function settime(obj) { //发送验证码倒计时if (countdown == 0) {obj.attr('disabled',false);obj.val("免费获取验证码");countdown = 60;return;} else {obj.attr('disabled',true);obj.val("重新发送(" + countdown + ")");countdown--;}//定时setTimeout(function() {settime(obj)},1000);}</script><script>$("#sub").click(function () {var code = "${code}";var codes = $("#code").val();if (codes != ""){if (code == codes){alert("验证成功");alert(code+"  " +codes);window.location.href = "../index.jsp";}else{alert("验证失败");}} else{alert("请输入验证码");}<%--$.ajax({--%><%--type:'post',--%><%--url:"${pageContext.request.contextPath}/note/selectNote"--%><%--});--%>//$("#myForm").submit();});
</script>
</body>
</html>

 

 

index.jsp 模拟成功页面

<%@ page language="java" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<body>
<h2>手机登录成功</h2></body>
</html>

 

 程序页面

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/71568.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里短信验证码接口和支付宝沙箱支付接口

阿里短信验证码接口和支付宝沙箱支付接口 一、阿里短信验证码接口 1. 申请阿里AccessKey&#xff0c;填写AccessKey ID和AccessKeySecret 2. 申请短信的签名名称和模板 Java的API接口如下&#xff0c;其中模板可根据自己需要进行修改 /**发送短信*/public Integer SendMsg(Stri…

关键词生成原创文章及句子的软件!开发原理分析

朋友们大家好&#xff01;今天又要来给大家上一课吧&#xff0c;关于输入关键词自动生成文章的软件大家觉得网上有没有&#xff1f; 答案&#xff1a;肯定是没有&#xff01; 那么我们今天就给大家带来这么一款软件&#xff0c;我们只需要输入你的关键词就能自动生成原创文章…

写文案,认准这几个APP就够了

想要写出10w的文案&#xff0c;也不是那么容易的&#xff0c;毕竟如果要是能够那么轻易的就写出来的话&#xff0c;也不会有那么多人为了这个文案而感到头秃了。但是你要是说它容易的话&#xff0c;也是有窍门的如果我们按照窍门来进行编写的话&#xff0c;就会相对来说容易一些…

这款“狗屁不通”文章生成器火了,效果确实比GPT 2差太远

整理 | 夕颜 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 【导读】最近&#xff0c;一个名字相当接地气的“狗屁不通”文章生成器&#xff08;BullshitGenerator&#xff09;火了&#xff0c;截至目前 GitHub 上 Star 数已超过 3200&#xff0c;还上了微博热搜…

【IEEE】IEEE论文接收后proof(校样)全流程实例讲解

文章目录 1. proof邮件内容分块解读1.1 获取你的校对文件的步骤1.2 上传修正稿关于什么时候缴费 2、校对稿首页的一般说明 在论文被接受并提交Final Version.pdf文件之后的第4天&#xff0c;收到了proof(校样)的要求。(注意&#xff1a;由于IEEE旗下期刊众多&#xff0c;编辑和…

计算机硕士论文盲审,研究生毕业论文盲审那些事,你造吗?

原标题&#xff1a;研究生毕业论文盲审那些事&#xff0c;你造吗&#xff1f; 首先声明&#xff0c;盲审研究生论文——无论博士或是硕士——纯粹属于扯淡之列&#xff0c;虽然鄙人无权更正&#xff0c;也不敢不从&#xff0c;但根本没有看得起发明该项技术的人&#xff01; 有…

输入正确的账号密码和验证码后 验证码一直报错误的解决办法

这两天写了一个登录的功能页面&#xff0c;用的是ivew&#xff0c;大致样子长这样 输入正确的账号密码以及验证码后死活提示验证码错误&#xff0c;后来查了下才发现需要对发起请求的时候配置 withCredentials: true 我用的是axios&#xff0c;配以了一下就可以了&#xff0c;…

Windows10系统中Foxmail修改密码之后登录一直提示密码错误

情况说明&#xff1a;这是Windows10中自带的针对Foxmail邮箱的特殊毛病 1&#xff1a;右键Foxmail图标&#xff0c;选择属性 2&#xff1a;点击“兼容性” 点击下面“更改所有用户的设置” 3&#xff1a;勾选“以管理员身份运行此程序”

java基于Android快递物流服务系统

&#xff08;1&#xff09;后台管理平台 设计实现物流管理平台&#xff0c;完成对司机、所载货物、出发点、目的地、运输轨迹等的管理。主要研究的内容为前后端框架的选择&#xff0c;对系统信息的展示与管理。 数据展示&#xff1a;管理人员通过不同的筛选条件&#xff0c;查…

一篇文章告诉你,为什么移动数据捕获对运输物流公司很重要?

随着世界走向数字化和智能手机的使用增加&#xff0c;移动数据采集正在成为大多数行业的新常态。航运物流也不例外。从捕获详细的订单和交付信息到跟踪货运和仓库位置&#xff0c;条形码技术用于运输物流世界的每一步。通过智能数据采集&#xff0c;运输和物流公司可以获得更好…

盘点那些参与央行数字货币的公司们

来源:互链脉搏 法定数字货币一直属于央行内部的保密项目&#xff0c;其参与方的身份更是神秘。而12月24日&#xff0c;几则消息的公布&#xff0c;使得央行数字货币参与方的轮廓愈加清晰。 当天&#xff0c;腾讯内部发布了《关于成立数字货币研究项目组&#xff08;虚拟组织&am…

新春特辑 | 大数据专题合辑 报告下载

志在哪里&#xff0c;哪里就有成功&#xff1b;心在哪里&#xff0c;哪里就有风景&#xff1b;爱在哪里&#xff0c;哪里就有感动。在新年来临之际&#xff0c;互联互通社区衷心祝愿您&#xff1a;春节快乐&#xff0c;身体健康&#xff0c;心想事成&#xff01; 1、2020大数据…

元宇宙游戏开发 元宇宙游戏开发公司

元宇宙游戏开发、元宇宙操作系统开发设计、元宇宙操作系统基本建设、元宇宙游戏开发源码、沉浸式体验元宇宙游戏开发、大中型元宇宙游戏开发、元宇宙土地修建、3D元宇宙游戏开发。现阶段&#xff0c;大家精英团队在元宇宙游戏开发新项目层面的工作经验比较完善&#xff0c;在元…

mcu服务器芯片 概念股,MCU芯片概念股名单一览,6股2021股价翻番

缺“芯”给了MCU芯片概念股一剂强行针&#xff0c;23只MCU芯片概念股中竟有6股2021股价涨幅超100%【富满电子、国民技术、全志科技、上海贝岭、士兰微、中颖电子&#xff0c;其中富满电子、国民技术股价涨幅超200%】&#xff0c;为此MCU芯片概念股完全可以雄霸A股2021年各种热门…

HTML+CSS制作仿制当当网

新程序员&#xff1a;一起进步 目录 前言 一、项目代码 1.头部 2.导航栏 3.banner图 4.主体 5.底部 6.附录 前言 本项目是基于Html5CSS3技术所制作的静态网页&#xff0c;适合新手练习学习完成html之后所独立完成的静态网页 一、项目代码 1.头部 效果图&#xff1a…

STM32应用开发实践教程:初识STM32

1.1.1 什么是 STM32 1&#xff0e;STM32 概述 STM32 微控制器是意法半导体&#xff08;ST Microelectronics&#xff0c;ST&#xff09;有限公司出品的一系列微控制 器&#xff08;Micro Controller Unit&#xff0c;MCU&#xff09;的统称。 意法半导体有限公司于 1987 年 6 月…

物联网应用案例:镇海智慧水务

作者 | 余章琪 责编 | 薄荷茶 微信公众号ID | csdn_iot 1 项目简介 宁波市镇海区智慧水务项目建设内容包括水环境治理设施监测、水务信息资源中心、水务综合监管平台&#xff08;监测监控、治水监督、应急指挥、综合服务、决策支撑及集成开发&#xff09;、水务专题应用&#x…

Hyperchain超块链创始人史兴国解读“A股Web3.0概念股涨停潮”

最近A股上市公司Web3.0概念股逆势大涨&#xff0c;成为市场新热点。11月10日&#xff0c;Web3.0概念股掀起涨停潮&#xff0c;其中天地在线获10天8板&#xff0c;榕基软件4连板。飞利信、中文在线、二六三、科蓝软件、东港股份等多家上市公司回应已布局相关业务。Hyperchain超块…

I2C协议

关于I2C I2C最早是飞利浦公司在1982年开发的一种双向二线制串行总线协议。它只需要两根信号线就能完成信息交换&#xff0c;发展至今已经有100kHz、400kHz、1MHz、3.4MHz、5MHz五种通信速率。最终通信速率取决于外设而非主机芯片。 I2C信号线 SCL时钟线 SCL时钟线决定了通信…

一周信创舆情观察(2021.12.27~2022.1.3)

一、一周舆情要点 2021年12月24日,《中华人民共和国科学技术进步法》修订通过,其中第九十一条明确:对境内自然人、法人和非法人组织的科技创新产品、服务,在功能、质量等指标能够满足政府采购需求的条件下,政府采购应当购买;首次投放市场的,政府采购应当率先购买,不得…