微信公众号硬件开发杂谈(一)

目录

  • 该怎么连接

    • 准备工作
    • 常规方法
    • JS-SDK

最近帮朋友研究一个单片机的项目,简单接触了一下微信公众号的硬件平台,遇到很多问题,简单记录一下

该怎么连接

准备工作

首先不管用什么接口,做硬件和软件的交互一般还是先想着怎么去做一个基础的连接操作,最开始查到一些教程并参考微信官方的说法就是先申请设备接入的权限,以测试号来说,申请非常简单,如图所示

申请完成后,点击【设置】进入设备管理页面,按照提示一步步操作就可以添加设备,我这边是使用的是第三方的硬件设备,通过wifi进行连接,根据相关文档进行如下设置,具体选项内容应该要根据硬件设备类型来定。

经过简单的设置就可以生成一个设备,可以在设备列表看到,另外提一下,似乎一直都存在一个意义不明的undefined设备,应该是平台开发人员保留的,不影响使用

常规方法

通过这种方式新建的设备默认拥有100个配额,代表能授权100个可以控制的设备,我这里的截图中是已经授权了一个设备,授权需要通过接口发送请求,具体接口内容在后面详述。之后开始说第一次连接这个重要的问题,但是我这边并不方便验证结果,在这里说下最后的实践结果。一些教程会提到通过扫描产品详情里的二维码就可以执行连接操作,但对于普通测试情况并不符合。以下是通常情况的操作流程:

  • 在产品配置中连接方式选择wifi
  • 进行设备授权(不确定是否必要)
  • 扫描产品详情中的二维码会调起Airkiss页面(现在先简单理解成一个输入你当前连接wifi的密码的页面)
  • 打开硬件设备的AirLink模式,并在手机上输入wifi密码进行连接
  • 连接成功后,会跳转至一个搜索设备的页面

1hcjud.jpg)

问题就出在最后一步,我在这里进行了反复的测试,前置的配置操作重复了很多遍,还换过开发板,在这里都是搜索不到设备,经过大量的查找资料发现如果想通过这种方式扫描到设备必须在设备芯片的固件中写入公众号的ID,并且我后来也在设备详情中发现了相关依据

虽然找到了问题,但是固件的编写是个很大的问题,简单的烧录可以做到,但修改编译固件的代码却是不懂,所幸后面发现了另一种方法,但是由于最终使用的固件版本是第三方平台机智云的,所以无法验证其他的情况是否可以,这里主要是记录一下开发的过程。

JS-SDK

上面介绍的方法在扫码后就会自动跳出一个页面,这个是微信官方提供的,如果不想使用这个页面的话就可以通过JS-SDK的方式。

在进行下一步操作之前我们还要了解一下这个跳出的页面是什么,官方的描述如下:

Airkiss是微信硬件平台为Wi-Fi设备提供的微信配网、局域网发现和局域网通讯的技术。开发者若要实现通过微信客户端对Wi-Fi设备配网、通过微信客户端在局域网发现Wi-Fi设备,或者把微信客户端内的音乐、图片、文件等消息通过局域网发送至Wi-Fi设备,需要在硬件设备中集成相应的AirKiss静态库。

通过这句话我们可以知道要想在局域网内发现设备就可以通过这一方法,更详细的说明可以看这个页面
AirKiss概述及应用场景

根据Airkiss2.0的文档我们可以知道通过JSAPI可以进行配网,以达到我们的目的。首先在Web层引用微信JSAPI,JSAPI技术是微信JS-SDK的一部分,,主要是通过 wx.readywx.config 这两个函数调用官方的接口,具体说明参考
JSAPI介绍

使用Airkiss文档里的configWXDeviceWiFi这个方法就可以进行自定义的AirKiss连接,这里我使用的框架是ASP.NET MVC,所以可以看到AppID、timestamp、nonceStr、signature这几个参数是从后台传入的,具体的后台生成代码放在下面参考,有些参数需要自行传入,注意修改。

<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script type="text/javascript">
    $(function () {

    });

    $('#btnLink').click(function () {
        wx.config({
            beta: true,
            debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
            appId: '@ViewBag.appId', // 必填,公众号的唯一标识
            timestamp: '@ViewBag.timeStamp', // 必填,生成签名的时间戳
            nonceStr: '@ViewBag.randomStr', // 必填,生成签名的随机串
            signature: '@ViewBag.signatur',// 必填,签名
            jsApiList: ["configWXDeviceWiFi"] // 必填,需要使用的JS接口列表
        });
        wx.invoke('configWXDeviceWiFi');
    });
</script>

C#后台代码参考

public class AirkissHelper
{
    public static string appID = BaseConfig.appID;
    public static string appsecret = BaseConfig.appsecret;

    class TokenResultMessage // 封装调用access_token接口返回的数据
    {
        public string access_token;
        public string expires_in;
    }

    class JsapiResultMessage // 封装调用jsapi_ticket接口返回的数据
    {
        public string errcode;
        public string errmsg;
        public string ticket;
        public string expires_in;
    }

    /// <summary>
    /// Get请求封装
    /// </summary>
    /// <param name="url"></param>
    /// <returns></returns>
    private static string GetWebUrl(string url)
    {
        WebClient client = new WebClient(); // 创建浏览器
        Stream stream = client.OpenRead(url); // 传入url地址
        return new StreamReader(stream).ReadToEnd(); // 得到响应字符串
    }

    /// <summary>
    /// sha1签名算法
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    private static string Sha1(string str)
    {
        var sha1 = System.Security.Cryptography.SHA1.Create();
        byte[] bytes = Encoding.UTF8.GetBytes(str);
        byte[] bytesArr = sha1.ComputeHash(bytes);
        StringBuilder sb = new StringBuilder();
        foreach (var item in bytesArr)
        {
            sb.AppendFormat("{0:x2}", item);
        }
        return sb.ToString();
    }

    /// <summary>
    /// 生成时间戳
    /// </summary>
    public static string GetTimeStamp()
    {
        TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1);
        return Convert.ToInt64(ts.TotalSeconds).ToString();
    }

    /// <summary>
    /// 生成32位随机字符串
    /// </summary>
    public static string GetRandomStr()
    {
        string strArr = "0123456789QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";
        Random rand = new Random();

        string randStr = "";
        for (int i = 0; i < 32; i++)
        {
            int index = rand.Next(strArr.Length);
            randStr += strArr.Substring(index, 1);
        }
        return randStr;
    }

    /// <summary>
    /// 生成签名
    /// </summary>
    public static string GetSignatur(string timestamp,string nonceStr)
    {
        // 通过API获取access_token
        string tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appID + "&secret=" + appsecret;
        var tokenInfo = new JavaScriptSerializer().Deserialize<TokenResultMessage>(GetWebUrl(tokenUrl));

        // 通过API获取jsapi_ticket
        string jsapiUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + tokenInfo.access_token + "&type=jsapi";
        var jsapiInfo = new JavaScriptSerializer().Deserialize<JsapiResultMessage>(GetWebUrl(jsapiUrl));

        // 当前网页的URL,不包含#及其后面部分
        string nowUrl = BaseConfig.nowUrl;
        //string nowUrl = Request.Url.AbsoluteUri; // 部署服务器后应动态获取页面url

        // 用Dictionary集合存储各变量
        Dictionary<string, string> dic = new Dictionary<string, string>
        {
            ["timestamp"] = timestamp,
            ["noncestr"] = nonceStr,
            ["url"] = nowUrl,
            ["jsapi_ticket"] = jsapiInfo.ticket
        };

        // 对变量名字典排序
        string[] arrKey = new string[] { "timestamp", "noncestr", "url", "jsapi_ticket" };
        arrKey = arrKey.OrderBy(n => n).ToArray();

        // 拼接字符串
        string signatureStr = "";
        foreach (var item in arrKey)
        {
            signatureStr += item + "=" + dic[item] + "&";
        }
        signatureStr = signatureStr.Substring(0, signatureStr.Length - 1);

        // 对拼接串sh1签名,得到最终签名
        return Sha1(signatureStr);
    }
}

做好配置部分的代码后,在页面上使用 wx.invoke(‘configWXDeviceWiFi‘);就可以手动调起Airkiss页面,输入wifi密码后手动连接,根据wx.config里面的debug配置会返回提示消息。

原文地址:https://www.cnblogs.com/LFeather/p/10992200.html

时间: 2024-10-19 13:06:54

微信公众号硬件开发杂谈(一)的相关文章

微信公众号退款开发

博主是小菜鸟,这篇文章仅是自己开发的随笔记录,不足博友可以指出来,一起进步 1.[微信支付]公众号支付开发者文档链接地址 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4 调用微信退款接口,需要发送特定的xml格式字符串到到微信退款接口: 2.微信申请退款需要双向证书, JAVA只需要使用apiclient_cert.p12即可,证书从 https://pay.weixin.qq.com/index.php/core/hom

微信公众号支付开发全过程 --JAVA

按照惯例,开头总得写点感想 ------------------------------------------------------------------ 业务流程 这个微信官网说的还是很详细的,还配了图.我还要再说一遍. 用户点击一个支付按钮-->{后台一大推处理}-->用户看到了一个输入密码的界面,包含金额等一些信息-->用户输入密码后出来一个支付成功的页面(这部分流程都是微信自己完成的,我们什么都不用做)-->返回系统自己的页面(总不能让用户一直看着一个支付完成的页面吧

C#/ASP.NET MVC微信公众号接口开发之从零开发(二) 接收微信消息并且解析XML(附源码)

文章导读: C#微信公众号接口开发之从零开发(一) 接入微信公众平台 微信接入之后,微信通过我们接入的地址进行通信,其中的原理是微信用户发送消息给微信公众账号,微信服务器将消息以xml的形式发送到我们的绑定的地址上,通过解析XML数据,获取到微信用户发送的消息,让根据微信消息(文本:关键字,图片,语音等等)回复XML格式的数据给微信服务器,微信服务器再将接收到的消息返回给用户微信. 我们所需要做的:接收消息和返回消息 一.创建实体类 首先看文档http://mp.weixin.qq.com/wi

C#/ASP.NET MVC微信公众号接口开发之从零开发(三)回复消息 (附源码)

C#/ASP.NET MVC微信接口开发文章目录: 1.C#/ASP.NET MVC微信公众号接口开发之从零开发(一) 接入微信公众平台 2.C#/ASP.NET MVC微信公众号接口开发之从零开发(二) 接收微信消息并且解析XML(附源码) 一.拼凑回复的XML字符串 微信被动回复的形式有一下六种: 1 回复文本消息 2 回复图片消息 3 回复语音消息 4 回复视频消息 5 回复音乐消息 6 回复图文消息 分别对应不同的XML形式,这里以文本消息和图文为例,读者举一反三其他的类似,不再赘述:

C#微信公众号接口开发,灵活利用网页授权、带参数二维码、模板消息,提升用户体验之完成用户绑定个人微信及验证码获取

一.前言 当下微信公众号几乎已经是每个公司必备的,但是大部分微信公众账号用户体验都欠佳,特别是涉及到用户绑定等,需要用户进行复杂的操作才可以和网站绑定,或者很多公司直接不绑定,而是每次都让用户填写账号密码.作为微信接口开发人员我们知道网页授权可以用作微信网页用作安全登录,带参数二维码的使用用作记录用户来源,模板消息用作购物消费等消息的通知,但是很少看到有综合利用这些高级接口做出体验比较好的公众账号,这里分享一些我开发的用户绑定和验证码的一些心得.所需要的接口有基础的回复.网页授权.带参数二维码.

Python微信公众号后台开发&lt;003&gt;:自定义菜单

有同学问道微信公众号后台开发的自定义菜单怎么实现? 这个问题本来想放到后面的,因为的确对公众号的影响挺明显的, 因为开启后台服务,公众号的自定义菜单就不见了,很影响使用, 也有同学问这个问题,就提前了,后面如果有进展会进行更新. 开发文档: https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Explanation_of_interface_privileges.html 订阅号账号分类及权限 订阅号分为个人号和企业订

抛砖微信公众号应用开发

现在微信营销,真是炙手可热,各行各业都在利用微信这个社交平台,基于微信服务器这个服务网关,开发自己的应用服务,通过微信进行传播,真是方便快捷高效!大体的通信架构如下图所示. 由于工作的需要,我也着手研究微信公众平台的开发,在这过去的一周的时间,折腾了一个小实验环境,打通微信的两个基本验证关卡. 第一道验证,就是URL,Token填写完成后,点击提交的过程.(后面会详述) 第二道验证,就是公众号服务器上面的帖子进行分享等操作时,为了让别人看到友好的“标题”+“描述”+“缩略图”这种模式的帖子,必须

使用开源库MAGICODES.WECHAT.SDK进行微信公众号支付开发

概要 博客使用Word发博,发布后,排版会出现很多问题,敬请谅解.可加群获取原始文档. 本篇主要讲解微信支付的开发流程,相关业务基于MAGICODES.WECHAT.SDK实现.通过本篇教程,您可以很方便的快速完成微信公众号支付的开发. 关于Magicodes.WeChat.SDK MAGICODES.WECHAT.SDK为心莱团队封装的轻量级微信SDK,现已全部开源,开源库地址为:https://github.com/xin-lai/Magicodes.WeChat.SDK 更多介绍,请关注后

微信公众号支付开发

最近做了公众号支付,从无到有.大概经历如下步骤: 开发环境 VS2015 W10 .NET4.6 一.公众号 客户公司没有公众号,也不会申请.于是打开微信公众号介面,告诉它一步步弄.最后申请了一个服务号,并且提交了认证申请.其中大概有几处注意 : 微信号公众号名字(这个有被占用的情况).认证时提交的身份信息,企业的三证合一拍照上传. 认证申请提交后第3天时通过了,然后进入微信号开通支付功能,这个是指公众号的支付功能.过程中需要绑定银行帐号,选择经营项目,注意各项目营收费率不一样,经营资质拍照上传