1、准备两个程序,第一个负责加密,第二个负责对比和运行

2、 将stm32的flash未用区域开辟存储空间,模拟为EEROM存储。

第一个运行读取唯一ID,然后经过加密算法算出一组数组,将其存在上述空间里。

第二个程序运行读取ID,然后经过加密算法后和存在上述空间内的数据进行对比。如果对比OK则正常运行,如果不相同则可以为所欲为

stm32的flash128K及以下的都是1K每页,256K容量以上的是2K每页。每次擦除最小单位是页。

flash作为EEROM读写必须以半字读写,那么若干是8位的数据读写,则高八位其实是0x00,那么U8数组的两个相邻元素其实中间是隔一个0x00的,它们在内存flash里的地址是不连续的。

现有离线下载器,有滚码功能,但是它是以相邻四个字节作为存储空间而递增的。

所以现在有一个四字节的滚码(可以理解为设备的ID)需要下载的时候存进去。把滚码首地址定为FC00(63K,对于C8T6只有64K容量,其实这个地址是它的最后一页地址的首地址),其他信息存在FC04开始。。。那么读出来的两个半字(16位)的数据需要转换到8位变量。

        //读取ID参数 小端模式,低字节在低位
        STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)fu_temp,2);
        //读取ID        
        sbid[3]=fu_temp[1]>>8;//高字节
        sbid[2]=fu_temp[1];
        sbid[1]=fu_temp[0]>>8;
        sbid[0]=fu_temp[0];
则其他配置参数

         //是否第一次开机初始化需要写入
	if(fu_temp[0]!=0xaba2)
	{	
	  //第一次需要写入数据了
	  STMFLASH_Write(FLASH_SAVE_ADDR+2,(u16*)fu_index,30);
	  //读取工作参数
	  STMFLASH_Read(FLASH_SAVE_ADDR+2,(u16*)fu_temp,30);
        }

现在会遇到一个问题,如果中途要读写这个配置数据,那么必须整页擦除,那么滚码就可能丢失,所以要注意,有两种办法,
第一:如果程序只有60k大小,ID首地址取倒数第二页F800 ,配置地址取倒数第一页FC00,这样只要不是全片擦除,ID一直会在
第二:写数据的时候,把ID再从sbid数组里面取出来,放到fu_temp里面写进去。

以前入户是电信猫(ADSL),现在都是光纤猫了,而且都自带了路由器功能,也就是说宽带账号密码的登录由光猫自带了。。。后面只是扩展了

有线路由器包括了交换机的功能,先说有线网,多个设备用的多个网口,所以可以实现多核处理器分别吞吐每个口的数据,也可以单核处理器轮询(每个口挨个来)吞吐每个口的数据。然后对上一级网络就依次把数据按顺序转发即可。

无线路由器:由于没有多个网口,而且对于家用的路由器收发频率一般也是固定的(每次只能一个频率,除非检测干扰验证会换一个,但是频率数量有限)。

1、只有一个频率信道,WIFI相同的信道会干扰,一是由于同频干扰,造成底噪上升,二则是由于本身多址协议的不完善,WiFi的多址协议是CSMA/CA,简单来说就是,大家在发端发送数据,如果收到ACK回应就继续发,但如果同时有别人发送数据,发生碰撞,那大家都会推迟一个随机时间再发送数据,推迟时间的算法使用二进制指数退避,问题就来了,如果同时很多人发送数据,那么大家的数据一直在碰撞,一直在推迟发送,那反映到用户面就是速率很低,打开个网页都好卡。

2、如果是高端设备,同时可以几个收发器不同信号工作,那就相当于模拟了有线插口,每个收发器就是一个插口,那就可以独立吞吐数据而不干扰了。

3、还有一种类似于GSM网络的方法,时分多址技术,1其实也算这个技术,但是容易碰撞。GSM的这个就避免了这个碰撞,因为通话总不能让人说两遍吧,体验太差。这个方法是每个设备给一个时间片段收发数据,类似于单核处理器处理任务一样,是这个片很小,人体验不明显就算OK。当然GSM也用了多频技术(这个在频谱比较宽的4G网络肯定用了,毕竟频率间隔需要一定距离否则容易干扰)

例如,1G采用频分多址(FDMA)、2G时分多址(TDMA)、3G码分多址(CDMA),4G正交频分多址(OFDMA)。

做一个板子,才开始没想有没有DAC用了习惯的stm32f103C8T6,板子做回来,很简单的程序测试,就是没有DAC输出,后来发现这个48脚的没有DAC。。

于是,就改用64脚的,自己买的正点原子的mini板子也是RBT6,然后今天板子回来,焊接了两片都不行,当场惊呆了。。。隐约怀疑是不是也没有DAC,但是正点原子的教程有DAC啊

去官方网站查看了,64脚的只有RCT6才有DAC,RBT6是没有的,为什么教程有DAC呢?后来发现,原子最近一两年卖的mini板已经换成了RCT6,而我看的是新教程,我看以前光盘里面的资料的教程,果然没有DAC这个例程。。。。。

fuck了狗了,看来不能凭直觉,以后做项目之前要确定资料。。。还好RCT6也是64脚的,只需要买芯片回来换上就行了。。。之前的48脚的板子就废了。。。教训啊,搞硬件真的很影响心情,随时就觉得不科学。。。

1、用PHP5及以上的函数 stream_socket_client或者其如果是服务器的用server,此方法有参数,但是网上资料很少提及用法,干脆就啥也不加了,超时设置了好像没有作用。此方法是否是阻塞的(比如多个人用浏览器同时用这个会如何,是否会等一个执行完了,然后排队处理?有可能是,因为PHP是单线程的运行方式?那网站也是用的PHP,也可以提供N多人访问呢)

2、用gw的http转异步TCP的方法,感觉速度还可以,至于跟1中的方法如何对比还不确定。

iOS 证书

1CSR 是请求文件MAC电脑里面钥匙串助理,请求生成的

2、通过网站Certificate里面申请开发证书或者发布证书cer,需要用到CSR文件。

2中的文件可以安装本机器之后,导出p12文件,用来给其他电脑使用,导出证书都会有一个密码要设置)

3、在网站identifiers里面的App IDs里面设置这个是跟APP工程包名一致的,每个APP需要增加一个。

4、真机调试之前需要在网站Devices里面增加你的手机设备的UUID.

5、申请描述文件,描述文件在网站的Provision Prefiles里面增加,分真机调试(需要勾选4中的设备)和发布APP Store两种文件,后缀mobileprobison

开发者网站后台地址:https://developer.apple.com

stm32发送第一个字节会丢失,才开始以为是电脑软件的问题,后来发现,无论如何第一个字节都丢失。一般都是copy来的函数,主要是因为发送函数

//串口1发送一个字节
void Uart_Send_Byte(u8 dat)
{
    USART_SendData(USART1,dat);
    while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束// 等特数据传送(TI发送中断标志)
}
stm32开机默认TC标志是1,需要读取一下才清0,而发送第一个的时候,while还没有运行,所以第一个字节没有实际发出去。只要发送前加上一句话就可以了。
void Uart_Send_Byte(u8 dat)
{
    USART_GetFlagStatus(USART1, USART_FLAG_TC);//读取清除标志
    USART_SendData(USART1,dat);
    while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束// 等特数据传送(TI发送中断标志)
}

ENC28J60比较复杂,W5500用了很久,这次做了一个转发服务模块,总是遇到各种现象。


1、W5500无论是TCP客户端还是服务端,通过自动或者手动KEEPALIVE来知道对方已经不在线,W5500的机制是双方必须都发送成功过数据,才会人为链路OK,才会发送心跳,否则抓包你是看不到的。这个其他地方都不一定说了。代码如下很简单,写寄存器,单位是5S,实测10S估计才掉线处理

//keepalive 心跳 手动
void Send_KA(SOCKET s)
{
Write_W5500_SOCK_1Byte(s,Sn_KPALVTR,0);
Write_W5500_SOCK_1Byte(s,Sn_CR,SEND_KEEP);
}

//自动keeplive 1-7
void AUTO_KA(void)
{
U8 i=0;
for(i=1;i<8;i++)
{
Write_W5500_SOCK_1Byte(i,Sn_KPALVTR,1);//1*5S
}
}

2、接收网络数据函数,这个是普遍例程里面的
size=Read_SOCK_Data_Buffer(0, Rx_Buffer);
这个size可能是0,如果发送串口出去,恭喜,单片机就2了,使劲发送各种乱起八糟的东西,看门狗就重启了,然后就RST。

测试了很久,这个芯片还是不错的,前提是连上网之后,但是有时候初始化阶段就进不去下一步,就是在等待网线插入那个函数是死循环
while((Read_W5500_1Byte(PHYCFGR)&LINK)==0)//等待以太网连接完成
{
if(debugflag==1)
{
LED=0;
Uart_Send_Byte(‘S’);
Uart_Send_Byte(‘Y’);
Uart_Send_Byte(‘:’);
Uart_Send_Byte(‘W’);
Uart_Send_Byte(‘A’);
Uart_Send_Byte(‘I’);
Uart_Send_Byte(‘T’);
Uart_Send_Byte(0x0d);
Uart_Send_Byte(0x0a);
delay_ms(100);
LED=1;
delay_ms(100);

}
}
加了一个指示的,方便确定是这里

个人博客:www.longjiancn.com
未来之家物联网实验室:www.fuhome.net