最近看了下邮箱,看到好多开发者还是有许多问题,尤其是微信硬件设备返回H5和返回服务器端的问题,其实本人认为这是微信给挖的一个大坑,对初开发者实在是有点棘手。请看下面会一一道来。
一、首先看流程图,还是拿前面章节的图来介绍
微信app和蓝牙设备接入通信,通信交互通道有两种,如下图通道路径结构图
黑色箭头 公众号html界面发送apdu命令到设备,设备最终返回数据到厂商服务器,厂商服务器也就是咱们开发者自己工程项目的服务器后端(数据返回到服务器配置url的 servelet的post方法中了)。这也是导致初学者开发者在开发h5界面发送指令后,无论如何在h5前端界面也得不到蓝牙设备返回数据包的原因,这是个坑,大家注意。
红色箭头 也就是我们接下来介绍的通道路径,公众号html界面发送apdu指令到设备,设备最终返回数据到发送html命令的界面,意思就是H5界面发送指令到设备,设备返回响应数据包到H5界面,而不是服务器端。
我相信,大部分开发者想走红色箭头的通道,可是在开发完代码测试的时候无论如何在H5界面接收不到硬件返回的数据,那么就需要开发者自己找原因了,寻找原因的办法如下:
验证硬件设备走的是黑色箭头通道:
1.1 打开微信公众号, 设备功能---》设置
配置URL,Token等,并且状态改为启用
URL的代码为一个普通的sevlet,代码如下:
//V型知识库www.vxzsk.com原创 import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.wepayweb.weixin.util.AppConst; import com.wepayweb.weixin.util.SignUtil; public class WeChatServletDevice extends HttpServlet { /** * */ private static final long serialVersionUID = -1043526256516085038L; private static String token; /** * Constructor of the object. */ public WeChatServletDevice() { super(); } /** * Destruction of the servlet. <br> */ public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here } /** * The doGet method of the servlet. <br> * * This method is called when a form has its tag value method equals to get. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("微信的get请求=================="); // 微信加密签名 String signature = request.getParameter("signature"); System.out.println("微信加密签名-----------------------"+signature); // 时间戳 String timestamp = request.getParameter("timestamp"); //System.out.println("时间戳-----------------------"+timestamp); // 随机数 String nonce = request.getParameter("nonce"); //System.out.println("随机数-----------------------"+nonce); // 随机字符串 String echostr = request.getParameter("echostr"); System.out.println("随机字符串-----------------------"+echostr); //System.out.println("token-----------------------:"+token); PrintWriter out = response.getWriter(); // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败 if (SignUtil.checkSignature(token, signature, timestamp, nonce)) { out.print(echostr); //System.out.println("这是:"+echostr); } out.close(); out = null; } /** * The doPost method of the servlet. <br> * * This method is called when a form has its tag value method equals to post. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 将请求、响应的编码均设置为UTF-8(防止中文乱码) request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); System.out.println("响应设备消息----start"); // 响应消息 PrintWriter out = response.getWriter(); out.print("123"); out.close(); } /** * Initialization of the servlet. <br> * * @throws ServletException if an error occurs */ public void init() throws ServletException { token = "RqstuxxxxsgjfujYJKJ7659"; // Put your code here } }
在sevlet中的post方法中打印输出一句话“响应设备消息”,一旦设备有响应,并且走的是服务器端通道,在服务端就会输出上述一句话。
上述代码中的init()方法中的token需要替换。
二、解决硬件设备返回到H5而不是服务器端的方法
查阅微信硬件官方文档说明得知,微信的返回方式默认为返回到服务器端,所以好多硬件工程师在开发硬件固件的时候并没有修改返回方式,直接默认设置,一旦验证设备返回到服务器端,那么就要和硬件工程师沟通,让他们把返回方式设置成返回H5端(我记得在C中设置type类型为1就是返回H5端,时间久了有这个印象)。
感觉本站内容不错,读后有收获?小额赞助,鼓励网站分享出更好的教程