iOS—YModem蓝牙固件升级
原理
1.首先理解什么是YModem通讯?
YModem协议是XModem的改进协议,它最用于调制解调器之间的文件传输的协议,具有快速,稳定传输的优点。它的传输速度比XModem快,这是由于它可以一次传输1024字节的信息块,同时它还支持传输多个文件,也就是常说的批文件传输。
YModem分成YModem-1K与YModem-g。
我使用的是YModem-1K 也就是一次传输1024字节。
YModem-1K用1024字节信息块传输取代标准的128字节传输,数据的发送回使用CRC校验,保证数据传输的正确性。它每传输一个信息块数据时,就会等待接收端回应ACK信号,接收到回应后,才会继续传输下一个信息块,保证数据已经全部接收。
YModem-g传输形式与YModem-1K差不多,但是它去掉了数据的CRC校验码,同时在发送完一个数据块信息后,它不会等待接收端的ACK信号,而直接传输下一个数据块。正是它没有涉及错误校验,才使得它的传输速度比YModem-1K来得块。
一般都会选择YModem-1K传输,平时所说的YModem也是指的是YModem-1K。下面就讲讲它的传输协议
由于上面都是些 C语言相关的所以省略了直接进入主题。 2.理解传输数据格式
/*** ========================================================================================* THE YMODEM:* Send 0x05>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>* 发送0x05* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< C* SOH 00 FF "foo.c" "1064'' NUL[118] CRC CRC >>>>>>>>>>>>>* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< C* STX 01 FE data[256] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>>* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<* ACK STX 02 FD data[256] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<* ACK STX 03 FC data[256] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK* STX 04 FB data[256] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK* SOH 05 FA data[100] 1A[28] CRC CRC>>>>>>>>>>>>>>>>>>* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK* EOT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< NAK* EOT>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< C* SOH 00 FF NUL[128] CRC CRC >>>>>>>>>>>>>>>>>>>>>>>* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK* ===========================================================================================**/
我们用的设备首先要发送0x05与蓝牙通讯 然后设备返回一个C 接受到C后立即发送头部包到设备 此处 需要CRC16校验 采用标准的欧美标准
接下来就可以依次进行数据发送
注意:每一个公司的协议是不一样的但是你理解原理之后 协议不管怎么改 都可以去解决。
发送YModem到蓝牙的关键代码 根据底层的协议去进行发送数据
//接受终端数据然后再发送数据到终端
- (void)setOTADataWithOrderStatus:(NSString *)status fileName:(NSString *)filename {//发送头包if([status isEqual:OTAC]){NSLog(@"Head");NSData *data_first = [self prepareFirstPacketWithFileName:filename];if([self.delegate respondsToSelector:@selector(onWriteBleData:)]){[self.delegate onWriteBleData:data_first];}}//发送第一包 和 最后的结束包 ACK/Celse if([status isEqual:OTASTART]){if(index_packet>0){NSData *data = [self prepareEndPacket];if([self.delegate respondsToSelector:@selector(onWriteBleData:)]){[self.delegate onWriteBleData:data];}index_packet = OTAUPEND;}else{// 正式包数组 获取所有拆解包放入数组中存储if (self.packetArray.count==0) {self.packetArray = [self preparePacketWithFileName:filename];}NSData *data = self.packetArray[index_packet];//写入蓝牙数据if([self.delegate respondsToSelector:@selector(onWriteBleData:)]){[self.delegate onWriteBleData:data];}index_packet_cache = index_packet;}}//接受到ACKelse if([status isEqual:OTAACK]){if(index_packet==OTAUPEND){NSLog(@"升级完成");}index_packet++;NSLog(@"ACK");if (index_packet < self.packetArray.count) {if (index_packet != index_packet_cache) {self.packetArray = [self preparePacketWithFileName:filename];NSData *data = self.packetArray[index_packet];//拆包发送if([self.delegate respondsToSelector:@selector(onWriteBleData:)]){[self.delegate onWriteBleData:data];}}index_packet_cache = index_packet;}else{Byte byte4[] = {0x04};NSData *data23 = [NSData dataWithBytes:byte4 length:sizeof(byte4)];NSLog(@"准备结束第一次OTA");if([self.delegate respondsToSelector:@selector(onWriteBleData:)]){[self.delegate onWriteBleData:data23];}}//沉睡300ms[NSThread sleepForTimeInterval:0.5];}//接受到NAK的时候else if([status isEqual:OTANAK]){if(index_packet>0){Byte byte4[] = {0x04};NSData *data23 = [NSData dataWithBytes:byte4 length:sizeof(byte4)];NSLog(@"准备结束第二次OTA");if([self.delegate respondsToSelector:@selector(onWriteBleData:)]){[self.delegate onWriteBleData:data23];}}else{NSLog(@"升级失败了");}}//通过代理返回当前你的升级大小if(self.packetArray.count>0){if([self.delegate respondsToSelector:@selector(onCurrent:onTotal:)]){[self.delegate onCurrent:index_packet onTotal:self.packetArray.count];}}
}
具体的详细过程 请看YYModemOCDemo
https://github.com/ArdWang/YModemlib_iOS
如果你喜欢就给我个star吧 目前更新到 v2.0.0版本
https://github.com/ArdWang/YModemOCDemo
iOS—YModem蓝牙固件升级相关推荐
- iOS 蓝牙固件升级
升级介绍 蓝牙固件升级是使用手机给固件进行版本升级,以达到修复bug或者添加新功能的作用.升级的大概流程是:首先,当蓝牙固件需要升级时,由嵌入式开发人员提供新的固件,由服务器管理人员将固件放到服务器上 ...
- iOS:蓝牙通讯开发快速上手
1. 思维导图 蓝牙知识的结构图 蓝牙数据通讯流程图 2. 苹果对蓝牙设备的要求 BLE:bluetouch low energy,蓝牙4.0设备因为低功耗,所有也叫作 BLE.苹果在 iPhone ...
- 关于IOS的蓝牙(转)
关于IOS的蓝牙 首先,你要了解你的目的是什么,一般的IOS蓝牙开发有以下三种目的: 1. IOS设备和IOS设备之间交互 好消息是:ios6.0可以把iPhone手机当从设备了,可以两台iPhone ...
- iOS简易蓝牙对战五子棋游戏设计思路之一——核心蓝牙通讯类的设计
iOS简易蓝牙对战五子棋游戏设计思路之一--核心蓝牙通讯类的设计 一.引言 本系列博客将系统的介绍一款蓝牙对战五子棋的开发思路与过程,其中的核心部分有两个,一部分是蓝牙通讯中对战双方信息交互框架的设计 ...
- iOS简易蓝牙对战五子棋游戏设计思路之二——核心棋盘逻辑与胜负判定算法
2019独角兽企业重金招聘Python工程师标准>>> iOS简易蓝牙对战五子棋游戏设计思路之二--核心棋盘逻辑与胜负判定算法 一.引言 上一篇博客我们介绍了在开发一款蓝牙对战五子棋 ...
- IOS开发-蓝牙实战项目-汪亮-专题视频课程
IOS开发-蓝牙实战项目-4475人已学习 课程介绍 该视频面向有一定开发经验的IOS开发人员,视频主要通过实际上线项目,讲解蓝牙的搜索,连接,手机发送数据,手机接收数据,并处理返回的 ...
- iOS蓝牙开发(三):iOS中蓝牙模块OTA升级(YModem协议)
上一篇简单介绍了蓝牙4.0的iOS实现代码,详细的东西大家可以去github上搜babyBluetooth,里面有一些学习资料,接下来分享的是OTA升级的东西,我们假定看这篇文章的时候,关于iOS和外 ...
- android蓝牙固件升级_AirPods Pro 如何升级固件开启「空间音频」?为何「空间音频」未生效?如何体验「空间音频」?...
(。・∀・)ノ゙嗨,各位,一般来到这篇文章的都是新购买了 AirPods Pro 的同学,先恭喜你们和我一样拥有了最最适合 iPhone (iPad)的无线降噪耳机,这耳机真的太美妙了 没有购买的赶紧 ...
- iOS开发 蓝牙技术4.0详解
前言 前端时间,同学在做项目过程中遇到关于蓝牙方面的问题,今天我就给大家进行详细的进行讲解下蓝牙在iOS开发中的具体实现.在介绍蓝牙前,大家要搞清楚什么是蓝牙? 什么是蓝牙? 随着蓝牙低功耗技术BLE ...
最新文章
- 全球自动驾驶汽车发展指数哪家强?美德领衔,中国第七
- 如何使用 50 行 Python 代码制作一个计算器
- c++STL容器的Queue
- java 死循环排查_java应用死循环排查方法或查找程序消耗资源的线程方法(面试)...
- 美国科学院公布新一批院士名单,中科院曹晓风及五名华裔教授当选
- 什么原因导致百度搜索比Google要少很多?
- sqlserver 导入mysql,在项目中迁移MS SQLServer到Mysql数据库,实现MySQL数据库的快速整合...
- 从ext2文件系统上读出超级块
- Android apk的安装、卸载、更新升级(通过Eclipse实现静默安装)
- mac上超好用的文字转语音工具【迅捷文字转语音】
- Cocos游戏打包apk
- 鲸探发布点评:9月21日发售高分一号、七号卫星数字藏品
- 个人GitHub学生认证经验分享
- 基于小程序开发的藏书馆
- 树莓派 电脑通过界面远程控制
- 用户画像场景与技术实现方案
- 资产管理3大重要性,你还不知道吗?
- Android 6.0以上动态申请文件读写权限
- python pass的含义
- 二进制与八进制、十进制、十六进制之间的相互转换
热门文章
- 小区物业管理系统(含源文件)
- Reading intermittently wrong data from core.Try slower target speed
- 我们正在酝酿什么?3CX 未来计划
- Decoupling the Depth and Scope of Graph Neural Networks(ShaDow-GNN)论文阅读笔记
- 消息队列RabbitMQ之初学者
- 保护小学生这件事上,腾讯拿出全球最严防沉迷措施
- 《全基因组测序WGS数据分析——4.构建WGS主流程》学习笔记
- python selenium 爬取去哪儿网的数据
- 免费下载中国地图china.js,在VUE使用echarts-map全国地图的方法和源码
- 实验九 3D编程基础