最近事情不多,回顾了一下自己这几年做了好多项目,赚不赚钱先不说,不过也没赚到钱,但是有必要把这些记录下来给自己留念,还有可以供初学的朋友们参考,接下来还有苹果外接摄像头,外接麦克风,苹果ipad笔,防丢器服务器搭建等,很多很多,这篇是接着上一篇,利用苹果MFI官方最新的技术IAP2协议修改定位,其中IAP2协议是比较复杂的一套协议,有些源码不方便贴出来,我会说一下开发流程和原理,展示一些应用层的代码。

1. 前提准备

       1. IAP2开发文档2. STM32F072开发板3. app开发外援。

2. 软件协议实现

     软件实现思路与上一篇的IAP1实现方式基本完全一样,其中不一样的有以下几点:1. IAP2协议替代IAP1协议。2. 这里IAP2协议用的USB传输,上篇文章IAP1协议用的uart传输。软件实现有以下流程:1.  按照IAP2文档先要配置USB配置,一个config, 两个interface,四个ep。如下:



不管任何平台,如果用到USB模式的IAP2协议,都要先修改USB描述符部分,根据文档修改,以下是我修改STM32的示例,下面是config的示例:
下面展示一些 内联代码片

const uint8_t USBD_MSC_CfgDesc[USB_MSC_CONFIG_DESC_SIZ] =
{ 0x09,   /* bLength: Configuration Descriptor size */USB_DESC_TYPE_CONFIGURATION,   /* bDescriptorType: Configuration */USB_MSC_CONFIG_DESC_SIZ,0x00,0x02,   /* bNumInterfaces: 1 interface */0x01,   /* bConfigurationValue: */0x00,   /* iConfiguration: */0xC0,   /* bmAttributes: */0x32,   /* MaxPower 100 mA *//********************  Mass Storage interface ********************/0x09,   /* bLength: Interface Descriptor size */0x04,   /* bDescriptorType: */0x00,   /* bInterfaceNumber: Number of Interface */0x00,   /* bAlternateSetting: Alternate setting */0x02,   /* bNumEndpoints*/0xff,   /* bInterfaceClass: MSC Class */0xf0,   /* bInterfaceSubClass : SCSI transparent*/0x00,   /* nInterfaceProtocol */0x07,          /* iInterface: *//********************  Mass Storage Endpoints ********************/0x07,   /*Endpoint descriptor length = 7*/0x05,   /*Endpoint descriptor type */MSC_IN_EP,   /*Endpoint address (IN, address 1) */0x02,   /*Bulk endpoint type */LOBYTE(MSC_MAX_PACKET),HIBYTE(MSC_MAX_PACKET),0x01,   /*Polling interval in milliseconds */ 0x07,   /*Endpoint descriptor length = 7 */0x05,   /*Endpoint descriptor type */MSC_OUT_EP,   /*Endpoint address (OUT, address 1) */0x02,   /*Bulk endpoint type */LOBYTE(MSC_MAX_PACKET),HIBYTE(MSC_MAX_PACKET),0x01,     /*Polling interval in milliseconds*//********************  Mass Storage interface1 ********************/0x09,    /* bLength: Interface Descriptor size */0x04,   /* bDescriptorType: */0x01,   /* bInterfaceNumber: Number of Interface */0x00,   /* bAlternateSetting: Alternate setting */0x00,   /* bNumEndpoints*/0xff,   /* bInterfaceClass: MSC Class */0xf0,   /* bInterfaceSubClass : SCSI transparent*/0x01,   /* nInterfaceProtocol */0x08,          /* iInterface: */0x09,   /* bLength: Interface Descriptor size */0x04,   /* bDescriptorType: */0x01,   /* bInterfaceNumber: Number of Interface */0x01,   /* bAlternateSetting: Alternate setting */0x02,   /* bNumEndpoints*/0xff,   /* bInterfaceClass: MSC Class */0xf0,   /* bInterfaceSubClass : SCSI transparent*/0x01,   /* nInterfaceProtocol */0x08,          /* iInterface: *//********************  Mass Storage Endpoints ********************/0x07,   /*Endpoint descriptor length = 7*/0x05,   /*Endpoint descriptor type */MSC_IN_EP1,   /*Endpoint address (IN, address 1) */0x02,   /*Bulk endpoint type */LOBYTE(MSC_MAX_PACKET),HIBYTE(MSC_MAX_PACKET),0x01,   /*Polling interval in milliseconds */ 0x07,   /*Endpoint descriptor length = 7 */0x05,   /*Endpoint descriptor type */MSC_OUT_EP1,   /*Endpoint address (OUT, address 1) */0x02,   /*Bulk endpoint type */LOBYTE(MSC_MAX_PACKET),HIBYTE(MSC_MAX_PACKET),0x01,     /*Polling interval in milliseconds*/
};

根据配置接下来实现interface中的描述的端点的收发函数就可以了。
我一般是实现上述配置端点后,会在ubuntu下先对这两个接口的四个端点进行收发测试,在ubuntu下利用libusb,对上述端点进行数据传输测试,只有传输通过后,才会进行下一步。

  1. 在ubuntu下用libusb测试端点。
    每换一个平台移植IAP2协议,我都会先进行这一步,如果这一步调不好,就不能往下进行的。我有在STM32,安霸,海思,建荣,慧联,全志,炬力的平台上都用USB跑过IAP2协议。下面是Ubuntu测试usbbulk传输的例子:

    下面展示一些 内联代码片

 //gcc -lusb-1.0
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <libusb-1.0/libusb.h>#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>#define VID 0x10D6
#define PID 0xB011int main(int argc, char **argv)
{int fd = -1;        // fd 就是file descriptor,文件描述符int k;unsigned char databuf[128];if(argc != 3){fprintf(stdout, "usage: %s  endpoint write0/read1 \n(eg: %s  1 1)\n",argv[0], argv[0]);return -1;}struct libusb_context *usb_context = NULL;libusb_device_handle *handle = NULL;int retv = 0;int endpoint = atoi(argv[1]);int wr = atoi(argv[2]);int bufsize = 16384;uint8_t *buf = (uint8_t *)malloc(bufsize);int cnt = 0;int ep;if(wr) ep = endpoint+0x80;else ep = endpoint;retv = libusb_init(&usb_context);if(retv != 0){fprintf(stderr, "failed init usb context: %s\n", libusb_error_name(retv));return -1;}handle = libusb_open_device_with_vid_pid(usb_context, VID, PID);if(handle == NULL){fprintf(stderr, "failed open device \n" );return -1;}fprintf(stderr, "open ok\n");retv=0;// retv = libusb_claim_interface(handle, 0);//if(retv != 0)//    {//         fprintf(stderr, "libusb_claim_interfaceERROR: rev error: %s\n", libusb_error_name(retv));//         return -1;//      }//etv = libusb_claim_interface(handle, 7);if(retv != 0){fprintf(stderr, "libusb_claim_interfaceERROR: rev error: %s\n", libusb_error_name(retv));return -1;}//retv = libusb_set_interface_alt_setting(handle, 7, 0);if(retv != 0){fprintf(stderr, "libusb_set_interface_alt_settingERROR: rev error: %s\n", libusb_error_name(retv));return -1;}int al = 0;  buf[0] = 0x55;buf[1] = 0;while(1){retv = libusb_bulk_transfer(handle, ep, buf, 16384, &al, 0);if(retv != 0){fprintf(stderr, "ERROR: rev error: %s\n", libusb_error_name(retv));return -1;}else{fprintf(stdout, "read bytes  OK  %d  cnt  %d  data 0x%x 0x%x 0x%x 0x%x\n", al, cnt, buf[0], buf[1], buf[2], buf[3]);if((buf[0]==0xff)&&(buf[1]==0x55)&&(buf[2]==0x02)){//write(fd, buf, al);retv = libusb_bulk_transfer(handle, 0x01, buf, al, &al, 0);}//retv = libusb_bulk_transfer(handle, endpoint, buf, al, &al, 0);}}//libusb_set_interface_alt_setting(handle, 0, 0);close(fd);libusb_close(handle);while(1);return 0;
}
  1. 上面USB测试通过后就可以连接IAP2协议的代码了。下面是USB接收端点的函数处理,接收到数据后送入IAP2的协议代码进行分析,然后做IAP2的相应操作,这部分之前做了很多测试,所有有点乱,但是都是经过测试验证过的。具体IAP2协议就不在这里介绍了。
    下面展示一些 内联代码片
// A code block
var foo = 'bar';

/*** @brief  USBD_MSC_DataOut*         handle data OUT Stage* @param  pdev: device instance* @param  epnum: endpoint index* @retval status*/
uint8_t  USBD_MSC_DataOut (void  *pdev, uint8_t epnum)
{uint8_t i;
//printf("in USBD_MSC_DataOut  epnum 0x%x\n", epnum);static uint8_t recv_flag=0;
static uint8_t cnt64=0;if (epnum == MSC_OUT_EP  ){/* Call the iAP layer function */// IapUSBD_AsynchEvent(IAP_BULKOUT_EP  , iAP3dBoxBulkBuff, ((USB_OTG_CORE_HANDLE*)pdev)->dev.out_ep[epnum].xfer_count);/* Prepare iAP BULK Out endpoint to receive audio data */
//  printf("111111111111111111111111111\n");
//  printf("len  0x%x  buf 0x%x  0x%x\n", ((USB_CORE_HANDLE*)pdev)->dev.out_ep[epnum].xfer_count, iAP3dBoxBulkBuff[0], iAP3dBoxBulkBuff[1]);// for(i=0;i<((USB_CORE_HANDLE*)pdev)->dev.out_ep[epnum].xfer_count; i++)
//          printf("recv  buf[%d]=0x%x\n", i, iAP3dBoxBulkBuff[i]);//DCD_EP_Tx (pdev, MSC_IN_EP, iAP3dBoxBulkBuff, ((USB_CORE_HANDLE*)pdev)->dev.out_ep[epnum].xfer_count);/* Fill the iAP FIFO with the received data */DataReceive_process(iAP3dBoxBulkBuff, ((USB_CORE_HANDLE*)pdev)->dev.out_ep[epnum].xfer_count);//收到苹果设备发给我们的IAP层数据包/* Call high layer to parse FIFO */DataReceive_ParseFiFo(); 解析收到的数据DCD_EP_PrepareRx(pdev, MSC_OUT_EP  , iAP3dBoxBulkBuff, IAP_3dBox_USBD_MPS );}if (epnum == MSC_OUT_EP1  ){//printf("ProcessFlage %d len  0x%x  buf 0x%x  0x%x \n", ProcessFlage, ((USB_CORE_HANDLE*)pdev)->dev.out_ep[epnum].xfer_count, EaNt3dBoxDataBulkBuff[0], EaNt3dBoxDataBulkBuff[1]);if(ProcessFlage == 0){if(((USB_CORE_HANDLE*)pdev)->dev.out_ep[epnum].xfer_count<64){if(recv_flag==1){memcpy(ProcessDataBulkBuff+2+cnt64, EaNt3dBoxDataBulkBuff, ((USB_CORE_HANDLE*)pdev)->dev.out_ep[epnum].xfer_count);ProcessDataBulkBuff[0] = 0;ProcessDataBulkBuff[1] = (cnt64+((USB_CORE_HANDLE*)pdev)->dev.out_ep[epnum].xfer_count);ProcessFlage = 1;recv_flag = 0;}else{if((EaNt3dBoxDataBulkBuff[0]==0x23)&&(EaNt3dBoxDataBulkBuff[1]==0x52)){ProcessDataBulkBuff[0]=0x23;ProcessDataBulkBuff[1]=0x52;ProcessFlage = 1;recv_flag = 0;}else if((EaNt3dBoxDataBulkBuff[0]==0x23)&&(EaNt3dBoxDataBulkBuff[1]==0x53)){ProcessDataBulkBuff[0]=0x23;ProcessDataBulkBuff[1]=0x53;ProcessFlage = 1;recv_flag = 0;                 }}cnt64 = 0;}else{recv_flag = 1;memcpy(ProcessDataBulkBuff+2+cnt64, EaNt3dBoxDataBulkBuff, 64);cnt64+=64;}}
/*          if(ProcessFlage == 0){memcpy(ProcessDataBulkBuff, EaNt3dBoxDataBulkBuff, ((USB_CORE_HANDLE*)pdev)->dev.out_ep[epnum].xfer_count);ProcessFlage = 1;}
*/DCD_EP_PrepareRx(pdev, MSC_OUT_EP1  , EaNt3dBoxDataBulkBuff, Data_3dBox_USBD_MPS );
//  DCD_EP_Tx (pdev, MSC_IN_EP1, EaNt3dBoxDataBulkBuff, ((USB_CORE_HANDLE*)pdev)->dev.out_ep[epnum].xfer_count);}//  MSC_BOT_DataOut(pdev , epnum);return USBD_OK;
}

3. 往上送GPS数据

IAP2认证通过后,就可以按照文档说明给ios送GPS数据了。


源码如下:
下面展示一些 内联代码片

// A code block
var foo = 'bar';
/*** @brief  Program entry point* @param  None* @retval None*/
int main(void)
{/*!< At this stage the microcontrollers clock setting is already configured, this is done through SystemInit() function which is called from startupfile (startup_stm32f072.s) before to branch to application main.To reconfigure the default setting of SystemInit() function, refer tosystem_stm32f0xx.c file*/  uint8_t key_buf[16];uint8_t data_buf[196];uint8_t gpgga_buf[128];uint8_t gprmc_buf[128];uint8_t gprmc_buf_f[128];uint8_t gpgga_len=0;uint8_t gprmc_len=0;uint8_t gprmc_len_f=0;uint8_t gprmc_mode=0;uint8_t i,j;uint8_t checksum;uint8_t checkbuf[2];uint8_t flag_pass=0;uint8_t ackbuff[19] = {0x21, 0x41, 0x43, 0x4b, 0x2c, 0x53, 0x54, 0x41,0x54, 0x45, 0x2c, 0x72, 0x75, 0x6e, 0x6e, 0x69,0x6e, 0x67, 0x0a,};uint8_t ackbuff1[12] = {0x21, 0x41, 0x43, 0x4b, 0x2c, 0x53, 0x2c, 0x31,0x30, 0x32, 0x30, 0x0a, };uint8_t ackbuff2[11] = {0x21, 0x41, 0x43, 0x4b, 0x2c, 0x47, 0x50, 0x53,0x2c, 0x31, 0x0a, };static uint8_t first_flag=0;for(i=0;i<16;i++){key_buf[i]=0;}//char key_buf[]="http://weixin.qq.com/r/VfoJEd-EFoJprZty969H";/* The Application layer has only to call USBD_Init to initialize the USB low level driver, the USB device library, the USB clock ,pins and interrupt service routine (BSP) to start the Library*/SystemInit (); USART1_Config();
//  TIM2_Config();printf("\r\nFengChi STM32F0 NOTE Board USBDevice Mass Storage in FS Mode...\r\n");printf("\r\nTime:%s\r\n", "("__DATE__ " - " __TIME__ ")");//test_acp();USBD_Init(&USB_Device_dev,&USR_desc, &USBD_MSC_cb, &USR_cb);if(WriteFlash()){while(1);}tim3config();pass_ok = 1;while (1){App_iAP_Init();App_iPOD_BgProcess(); // test_gpio_work();// test_acp();if(1==UsartReceiveNum.ReceiveFinishFlag){if(UsartReceiveNum.ReceiveNum>3){printf("\r\nWhat You Send:%s,length[%d]\r\n", \USART_RX_Buffer,UsartReceiveNum.ReceiveNum);//   /printf("i=%d\n", i);//      iAP2_Session_SendData((unsigned char * )USART_RX_Buffer, UsartReceiveNum.ReceiveNum-1);printf("over send \n");}UsartReceiveNum.ReceiveNum=0; UsartReceiveNum.ReceiveEndFlag=0;UsartReceiveNum.ReceiveFinishFlag=0;}if(GetUsbData(data_buf)==0){printf("222get data ok 0x%x  0x%x 0x%x 0x%x\n", data_buf[0], data_buf[1], data_buf[2], data_buf[3] );printf("~~%s\n", (uint8_t*)&data_buf[2]);checksum = 0;if((data_buf[0]==0x23)&&(data_buf[1]==0x52)){USB_SendData1(ackbuff, 19);  }else if((data_buf[0]==0x23)&&(data_buf[1]==0x53)){USB_SendData1(ackbuff1, 12); }else if((data_buf[7]=='$')&&(data_buf[8]=='G')&&(data_buf[9]=='P')&&(data_buf[10]=='G')&&(data_buf[11]=='G')&&(data_buf[12]=='A')){for(i=0;i<196;i++){if((data_buf[i]=='$')&&(data_buf[i+3]=='R')){break;}}if(i==196){printf("cannot find data\n");}else{j=0;checksum = 0;for(;;){if(data_buf[i]=='*') {gprmc_buf[j++]=data_buf[i++];gprmc_buf[j++]=data_buf[i++];gprmc_buf[j++]=data_buf[i++];gprmc_len = j;checkbuf[0] = (checksum>>4);checkbuf[1] = (checksum&0x0f);       if(checkbuf[0]>0x09){checkbuf[0]-= 0x09;checkbuf[0]+= 0x40;}else{checkbuf[0]+= 0x30;}if(checkbuf[1]>0x09){checkbuf[1]-= 0x09;checkbuf[1]+= 0x40;}else{checkbuf[1]+= 0x30;}if((checkbuf[0]==gprmc_buf[gprmc_len-2])&&(checkbuf[1]==gprmc_buf[gprmc_len-1])){printf("checksum  ok\n");if(data_buf[3]=='E'){printf("gprmc_mode 22  ok\n");gprmc_mode =2;memcpy(gprmc_buf_f, gprmc_buf, gprmc_len);gprmc_len_f = gprmc_len;USB_SendData1(ackbuff2, 11);   }else if(data_buf[3]=='W'){printf("gprmc_mode 11  ok\n");gprmc_mode =1;memcpy(gprmc_buf_f, gprmc_buf, gprmc_len);gprmc_len_f = gprmc_len;USB_SendData1(ackbuff1, 12);   }}else{printf("checksum  error checkbuf 0x%x  0x%x gprmc_buf 0x%x  0x%x\n", checkbuf[0], checkbuf[1], gprmc_buf[gprmc_len-2], gprmc_buf[gprmc_len-1]);}break;}gprmc_buf[j]=data_buf[i];if(j!=0){checksum ^= gprmc_buf[j];}j++;i++;}}}else if((data_buf[2]==0x55)&&(data_buf[3]==0x57)&&(data_buf[4]==0x43)&&(data_buf[5]==0x46)){printf("get udid\n");GetUUID(data_buf[9]);}else if((data_buf[2]==0x55)&&(data_buf[3]==0x57)&&(data_buf[4]==0x43)&&(data_buf[5]==0x47)){SetUUID(data_buf[9], data_buf);}else if((data_buf[2]==0x5a)&&(data_buf[3]==0xa5)){SetUUID(data_buf[9], data_buf);    }else{USB_SendData1(ackbuff2, 11);  }SetProcessFlage();}if(tim_end){tim_end=0;if(gprmc_mode==1){printf("start ~~%s\n", (uint8_t*)&gprmc_buf_f[0]);gprmc_buf_f[14]+=5;if(gprmc_buf_f[14]>0x39){gprmc_buf_f[14]-=10;gprmc_buf_f[12]+=1;if(gprmc_buf_f[12]>0x39){gprmc_buf_f[12]-=10;gprmc_buf_f[11]+=1;if(gprmc_buf_f[11]>0x35){gprmc_buf_f[11]-=6;gprmc_buf_f[10]+=1;if(gprmc_buf_f[10]>0x39){gprmc_buf_f[10]-=10;gprmc_buf_f[9]+=1;if(gprmc_buf_f[9]>0x35){gprmc_buf_f[9]-=6;gprmc_buf_f[8]+=1;if((gprmc_buf_f[8]>0x31)&&(gprmc_buf_f[7]==0x31)){gprmc_buf_f[7]=0x30;gprmc_buf_f[8]=0x30;}else if((gprmc_buf_f[8]>0x39)&&(gprmc_buf_f[7]==0x30)){gprmc_buf_f[7]=0x31;gprmc_buf_f[8]=0x30;}}}}}}  printf("end ~~%s\n", (uint8_t*)&gprmc_buf_f[0]);checksum = 0;for(i=1;i<gprmc_len_f;i++){if(gprmc_buf_f[i]=='*'){break;}checksum ^= gprmc_buf_f[i];}checkbuf[0] = (checksum>>4);checkbuf[1] = (checksum&0x0f);     if(checkbuf[0]>0x09){checkbuf[0]-= 0x09;checkbuf[0]+= 0x40;}else{checkbuf[0]+= 0x30;}if(checkbuf[1]>0x09){checkbuf[1]-= 0x09;checkbuf[1]+= 0x40;}else{checkbuf[1]+= 0x30;}gprmc_buf_f[gprmc_len_f-2] = checkbuf[0];gprmc_buf_f[gprmc_len_f-1] = checkbuf[1];printf("over ~~%s\n", (uint8_t*)&gprmc_buf_f[0]);iAP2_Session_SendData(gprmc_buf_f, gprmc_len_f);}else if(gprmc_mode==2){printf("send end\n");iAP2_Session_SendData(gprmc_buf_f, gprmc_len_f);}}}
} 

IAP2协议源码比较多,也不属于我这边的公开资源范围,总共有以下的文件:

4. 硬件原理图

5. app的原理和上一篇完全一样。

苹果IOS修改定位2-IAP2协议修改相关推荐

  1. 修改定位工具相关的app

    修改定位工具相关 修改定位工具1(修改经纬度):110_45b1627a34040c58f39d02036c0a030c.apk 修改定位工具2(修改经纬度):商店搜索 小鹏定位助手 工具3:根据经纬 ...

  2. 苹果微信更新不了最新版本_苹果iOS用户更新微信至版本7.0.13,可以进行微信号修改支持一年修改一次...

    今日,微信官方表示,苹果iOS用户更新微信至版本7.0.13,可以进行微信号修改支持一年修改一次,入口位于"我"-"个人信息"-"微信号", ...

  3. 苹果手机如何只用数据线修改定位

    苹果手机如何修改定位,只需用到一款简单的虚拟定位软件--iFakeLocation,直接在电脑安装,连接手机即可修改定位,支持最新的ios系统,上手简单,一分钟搞定. 工具/原料 windows电脑  ...

  4. 修改定位服务器,修改定位器服务器地址

    修改定位器服务器地址 内容精选 换一换 云平台支持修改主网卡的私有IP地址,具体操作请参见本节内容.如需修改扩展网卡的私有IP地址,请删除网卡,并挂载新网卡.弹性云服务器已关机.如果网卡绑定了虚拟IP ...

  5. 苹果iOS 15发布:关机也能定位,ASMR重度用户狂喜,这波库克又“去苹果化”了...

    梦晨 萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 万众瞩目的苹果iOS 15正式版终于来了! 最受关注的更新,要属"实况文本",现在复制图中的文字就像复制文本一样简 ...

  6. 【Android 逆向】Android 逆向基本概念 ( 定位内存中的修改点 | 基址寻址法 | 搜索定位法 )

    文章目录 一.定位内存中的修改点 1.基址寻址法 2.搜索定位法 一.定位内存中的修改点 使用 " 基址寻址法 " 或 " 搜索定位法 " 搜索 指定文件中的代 ...

  7. 关于微信小程序开发环境苹果IOS真机预览报SSL协议错误问题解决方案

    关于微信小程序开发环境苹果IOS真机预览报SSL协议错误问题解决方案 参考文章: (1)关于微信小程序开发环境苹果IOS真机预览报SSL协议错误问题解决方案 (2)https://www.cnblog ...

  8. 逍遥模拟器过检测_王者荣耀怎么修改定位变更荣耀战区提升排位--逍遥模拟器电脑版更换荣耀战区...

    王者荣耀怎么修改定位变更荣耀战区提升排位呢?我看了很多的答案,要么就是要就加微信号的假冒或者骗子信息,要么就是使用收费的软件,然后无法保证效果.真的没有简单好用还免费的方法吗? 下面我就将目前最简单方 ...

  9. 百度地图实现公司位置的定位,可拖动修改公司位置。

    百度地图实现公司位置的定位,可拖动修改公司位置.只需要维护x轴和Y轴的数据到数据库就可以了 可拖动,可搜索. <html><head><script src=" ...

最新文章

  1. Windows XP下屏蔽Ctrl_Alt_Del键的方法
  2. 【记录】vmware fusion 7 windows 10 unidentified network
  3. windows下tensorflow安装
  4. matlab中y=x(:,ones(1,3))的含义解读
  5. POJ3348-Cows【凸包,计算几何】
  6. 配置多个git账号_docker随手笔记第七节 jenkins通过git部署java微服务插件安装
  7. [翻译]创建ASP.NET WebApi RESTful 服务(9)
  8. 【正点原子STM32连载】第十章 STM32CubeMX简介 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
  9. 关于如何将SQL2008 R2数据库迁移到SQL2008
  10. 工业互联网是什么?发展有多厉害?
  11. 编写程序 - 打印购物小票.
  12. StyleGAN生成模型
  13. python 求和_python pandas行、列求和及累加求和
  14. 太白金星的考验----python while循环的执着
  15. 小融资 大趋势 小嗨互联网融资研究分析 20190101-20190104
  16. linux Deploy 安装debian
  17. 易语言抖音筛选在线tk号工具开发
  18. [操作系统笔记]处理机调度
  19. Java中获取CPU与内存利用率
  20. 支撑百万并发的“零拷贝”技术,你了解吗?

热门文章

  1. 4年功能测试月薪9.5K,3个月时间成功进阶自动化,跳槽涨薪6k后我的路还很长...
  2. Master HA彻底解密
  3. android adc,Android配置ADC接口
  4. 暴跌27%!科通芯城遭沽空机构狙击 被指“横跨十年的世纪骗案”
  5. css3价格斜切_css3 斜切角/斜边的实现方式
  6. R语言开发之我想要使用R语言进行开发的原因
  7. 2022高级Java笔试总结,阿里P8重点推荐的火爆全网MySQL路线笔记
  8. flash 嵌入html代码,flash嵌入html在html网页代码中嵌入Flash文件的解决方案(下).doc...
  9. linux grub 编辑器,KGRUBEditor: 可视化的 GRUB 编辑器
  10. 充满希望的新的一年!