本帖最后由 gaoyang9992006 于 2016-2-24 15:12 编辑
1、微信的基本架构(节选自微信官方协议文档)
厂商服务器和外设,由厂商开发完成。 微信会提供服务器的接口以对接厂商的服务器,会提供手机的接口(如本文规定的蓝牙协议)以对接厂商的外设。 主要功能该协议打通了设备和厂商服务器之间的数据链路,也就是支持将设备上的数据发送到厂商的服务器上,也支持将厂商的数据发送到设备。
厂商的数据对于微信来说,是黑盒,微信不对设备数据做分析。
该协议也打通了设备和微信服务器之间的数据链路。
设备和微信服务器之间的数据格式由微信规定,例如登录,新消息通知等。
2、微信蓝牙一般是基于串口的,所以只跟串口底层相关,也就是只需要将串口发送和接收两个函数填充到协议栈对外接口函数就行了。
先把微信SDK包加载在我们自己的项目中,如下我的项目添加到了interactive目录,4个c文件和4个h文件。
整个移植过程我们只需要改动proto.c文件里边5个接口函数。
3、微信传输的数据包结构
4、先把串口准备好,我的都在这个是uart.c文件中,以前的代码写的狗屎一般,看思路就行了。
#include "uart.h"
#include "uart_config.h"
enum BLE_TRAN_FSM
{
bMagicNumber = 0,
bVer,
nLenghth_hi,
nLenghth_low,
bdata,
};
unsigned char recv_from_ble_buf[60]= {0};
unsigned char m_frame_buffer[256]={0};
unsigned char rxbuf[256]={0};
unsigned char rx_idx=0;
unsigned short uart0_rx_len;
unsigned short uart0_rx_cnt=0;
unsigned short uart0_buf_num=0;
static unsigned char uart0_tran_state = 0;
unsigned char uart0_tran_complt = 0;
void UART0_Init(void)
{
}
void uart0_putchar(unsigned char dat)
{
}
unsigned char uart0_getchar(void)
{
return 0;
}
unsigned char UART0_Put_N_Byte (unsigned char* data_buf,unsigned char data_len)
{
unsigned char i;
//BT_EN_OFF;
for (i = 0; i < data_len; i++)
{
uart0_putchar(data_buf[i]);
}
//BT_EN_ON;
return data_len;
}
//拷贝串口缓冲区数据
unsigned char UART0_Get_Buf(unsigned char* data_buf)
{
unsigned char i;
if(uart0_tran_complt)
{
uart0_buf_num = uart0_rx_len;
for(i=0;i<uart0_rx_len;i++)
{
*data_buf ++ = rxbuf[i];
}
uart0_tran_complt = 0;
uart0_rx_len = 0;
}
else
{
uart0_buf_num = 0;
}
return uart0_buf_num;
}
void UART0_ISR(void)
{
rxbuf[rx_idx]=uart0_getchar(); //串口接收是从数据寄存器你读取数据,这个为了脱离平台限制,
//添加了一个uart0_getchar()的空函数
rx_idx+=1;
switch(uart0_tran_state)
{
case bMagicNumber:
if(MAGIC_NUMBER_ID == rxbuf[0])
{
uart0_tran_state = bVer;
}
else
{
uart0_tran_state = bMagicNumber; rx_idx=0;
}
break;
case bVer:
if(DEVEICE_VERSION_ID == rxbuf[1])
{
uart0_tran_state = nLenghth_hi;
//uart0_putstring("uart0_tran_state : bVer \r\n");
//预留用一个定时器来做超时检测
//uart0_timeout = 20;
}
else
{
uart0_tran_state = bMagicNumber; rx_idx=0;
}
break;
case nLenghth_hi:
uart0_tran_state = nLenghth_low;
break;
case nLenghth_low:
uart0_rx_len = (unsigned short) ((rxbuf[2]<<8)|rxbuf[3]);
uart0_tran_state = bdata;
break;
case bdata:
if(rx_idx == uart0_rx_len)
{
uart0_tran_complt = 1;
uart0_tran_state = bMagicNumber;
rx_idx=0;
}
//串口超时之后再添加
//if(uart0_timeout)
//{
// for(iRev=0;iRev<20;iRev++) {rxbuf[]=0;rx_idx=0;}
//}
break;
default:
uart0_tran_state = bMagicNumber; rx_idx=0;
break;
}
}
5、将proto.c文件里边
void Auth(unsigned char *pBuf , unsigned short int Length);
void Unpack_Auth_Response(unsigned char *buf , unsigned short int Length );
void Unpack_Init_Response(unsigned char *buf , unsigned short int Length );
void SendDataToManuf(unsigned char *buf , unsigned short int Length);
void Unpack_SendDataToManufacturerSvrResponse(unsigned char *buf , unsigned short int Length );
5个函数中的串口发送函数换成我们自己的。
6、我们接收厂商服务器的数据都在
void Unpack_ManufacturerSvrSendDataPush(unsigned char *buf , unsigned short int Length )
函数你解析.
7、连接过程
|