├── .gitignore ├── .travis.yml ├── MQTTExample.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ └── contents.xcworkspacedata ├── xcshareddata │ └── xcschemes │ │ └── MQTTExample.xcscheme └── xcuserdata │ └── jmesnil.xcuserdatad │ └── xcschemes │ └── xcschememanagement.plist ├── MQTTExample ├── Base.lproj │ └── Main.storyboard ├── Images.xcassets │ ├── AppIcon.appiconset │ │ └── Contents.json │ └── LaunchImage.launchimage │ │ └── Contents.json ├── MQTTAppDelegate.h ├── MQTTAppDelegate.m ├── MQTTExample-Info.plist ├── MQTTExample-Prefix.pch ├── MQTTViewController.h ├── MQTTViewController.m ├── en.lproj │ └── InfoPlist.strings └── main.m ├── MQTTExampleTests ├── MQTTExampleTests-Info.plist ├── MQTTExampleTests.m └── en.lproj │ └── InfoPlist.strings ├── Podfile ├── README.md └── screenshot.png /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | .DS_Store 3 | build 4 | */build/* 5 | *.pbxuser 6 | !default.pbxuser 7 | *.mode1v3 8 | !default.mode1v3 9 | *.mode2v3 10 | !default.mode2v3 11 | *.perspectivev3 12 | !default.perspectivev3 13 | *.xcworkspace 14 | !default.xcworkspace 15 | xcuserdata 16 | profile 17 | *.moved-aside 18 | DerivedData 19 | .idea/ 20 | *.hmap 21 | *.xccheckout 22 | 23 | #CocoaPods 24 | Podfile.lock 25 | Pods/ 26 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: objective-c 2 | 3 | before_install: 4 | - gem install cocoapods 5 | - brew update 6 | - brew uninstall xctool && brew install xctool 7 | 8 | script: 9 | - xctool -workspace MQTTExample.xcworkspace -scheme MQTTExample -sdk iphonesimulator -configuration Release build 10 | 11 | -------------------------------------------------------------------------------- /MQTTExample.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | archiveVersion 6 | 1 7 | classes 8 | 9 | objectVersion 10 | 46 11 | objects 12 | 13 | 0A2C699FDE82424F9DC3F192 14 | 15 | fileRef 16 | 9E073BF4FA5440CE84D8C24A 17 | isa 18 | PBXBuildFile 19 | 20 | 1AD9D60DF7F54B598BAAC54C 21 | 22 | buildActionMask 23 | 2147483647 24 | files 25 | 26 | inputPaths 27 | 28 | isa 29 | PBXShellScriptBuildPhase 30 | name 31 | Copy Pods Resources 32 | outputPaths 33 | 34 | runOnlyForDeploymentPostprocessing 35 | 0 36 | shellPath 37 | /bin/sh 38 | shellScript 39 | "${SRCROOT}/Pods/Pods-resources.sh" 40 | 41 | showEnvVarsInLog 42 | 0 43 | 44 | 93F45D6E18AFB6BC00E26E29 45 | 46 | children 47 | 48 | 93F45D8018AFB6BC00E26E29 49 | 93F45D9F18AFB6BC00E26E29 50 | 93F45D7918AFB6BC00E26E29 51 | 93F45D7818AFB6BC00E26E29 52 | F7CD9C58F3014E348414E982 53 | 54 | isa 55 | PBXGroup 56 | sourceTree 57 | <group> 58 | 59 | 93F45D6F18AFB6BC00E26E29 60 | 61 | attributes 62 | 63 | CLASSPREFIX 64 | MQTT 65 | LastUpgradeCheck 66 | 0500 67 | ORGANIZATIONNAME 68 | jmesnil.net 69 | TargetAttributes 70 | 71 | 93F45D9718AFB6BC00E26E29 72 | 73 | TestTargetID 74 | 93F45D7618AFB6BC00E26E29 75 | 76 | 77 | 78 | buildConfigurationList 79 | 93F45D7218AFB6BC00E26E29 80 | compatibilityVersion 81 | Xcode 3.2 82 | developmentRegion 83 | English 84 | hasScannedForEncodings 85 | 0 86 | isa 87 | PBXProject 88 | knownRegions 89 | 90 | en 91 | Base 92 | 93 | mainGroup 94 | 93F45D6E18AFB6BC00E26E29 95 | productRefGroup 96 | 93F45D7818AFB6BC00E26E29 97 | projectDirPath 98 | 99 | projectReferences 100 | 101 | projectRoot 102 | 103 | targets 104 | 105 | 93F45D7618AFB6BC00E26E29 106 | 93F45D9718AFB6BC00E26E29 107 | 108 | 109 | 93F45D7218AFB6BC00E26E29 110 | 111 | buildConfigurations 112 | 113 | 93F45DA718AFB6BC00E26E29 114 | 93F45DA818AFB6BC00E26E29 115 | 116 | defaultConfigurationIsVisible 117 | 0 118 | defaultConfigurationName 119 | Release 120 | isa 121 | XCConfigurationList 122 | 123 | 93F45D7318AFB6BC00E26E29 124 | 125 | buildActionMask 126 | 2147483647 127 | files 128 | 129 | 93F45D9118AFB6BC00E26E29 130 | 93F45D8B18AFB6BC00E26E29 131 | 93F45D8718AFB6BC00E26E29 132 | 133 | isa 134 | PBXSourcesBuildPhase 135 | runOnlyForDeploymentPostprocessing 136 | 0 137 | 138 | 93F45D7418AFB6BC00E26E29 139 | 140 | buildActionMask 141 | 2147483647 142 | files 143 | 144 | 93F45D7D18AFB6BC00E26E29 145 | 93F45D7F18AFB6BC00E26E29 146 | 93F45D7B18AFB6BC00E26E29 147 | 0A2C699FDE82424F9DC3F192 148 | 149 | isa 150 | PBXFrameworksBuildPhase 151 | runOnlyForDeploymentPostprocessing 152 | 0 153 | 154 | 93F45D7518AFB6BC00E26E29 155 | 156 | buildActionMask 157 | 2147483647 158 | files 159 | 160 | 93F45D9318AFB6BC00E26E29 161 | 93F45D8518AFB6BC00E26E29 162 | 93F45D8E18AFB6BC00E26E29 163 | 164 | isa 165 | PBXResourcesBuildPhase 166 | runOnlyForDeploymentPostprocessing 167 | 0 168 | 169 | 93F45D7618AFB6BC00E26E29 170 | 171 | buildConfigurationList 172 | 93F45DA918AFB6BC00E26E29 173 | buildPhases 174 | 175 | AF4506CA3A1447D8B72C03B6 176 | 93F45D7318AFB6BC00E26E29 177 | 93F45D7418AFB6BC00E26E29 178 | 93F45D7518AFB6BC00E26E29 179 | 1AD9D60DF7F54B598BAAC54C 180 | 181 | buildRules 182 | 183 | dependencies 184 | 185 | isa 186 | PBXNativeTarget 187 | name 188 | MQTTExample 189 | productName 190 | MQTTExample 191 | productReference 192 | 93F45D7718AFB6BC00E26E29 193 | productType 194 | com.apple.product-type.application 195 | 196 | 93F45D7718AFB6BC00E26E29 197 | 198 | explicitFileType 199 | wrapper.application 200 | includeInIndex 201 | 0 202 | isa 203 | PBXFileReference 204 | path 205 | MQTTExample.app 206 | sourceTree 207 | BUILT_PRODUCTS_DIR 208 | 209 | 93F45D7818AFB6BC00E26E29 210 | 211 | children 212 | 213 | 93F45D7718AFB6BC00E26E29 214 | 93F45D9818AFB6BC00E26E29 215 | 216 | isa 217 | PBXGroup 218 | name 219 | Products 220 | sourceTree 221 | <group> 222 | 223 | 93F45D7918AFB6BC00E26E29 224 | 225 | children 226 | 227 | 93F45D7A18AFB6BC00E26E29 228 | 93F45D7C18AFB6BC00E26E29 229 | 93F45D7E18AFB6BC00E26E29 230 | 93F45D9918AFB6BC00E26E29 231 | 9E073BF4FA5440CE84D8C24A 232 | 233 | isa 234 | PBXGroup 235 | name 236 | Frameworks 237 | sourceTree 238 | <group> 239 | 240 | 93F45D7A18AFB6BC00E26E29 241 | 242 | isa 243 | PBXFileReference 244 | lastKnownFileType 245 | wrapper.framework 246 | name 247 | Foundation.framework 248 | path 249 | System/Library/Frameworks/Foundation.framework 250 | sourceTree 251 | SDKROOT 252 | 253 | 93F45D7B18AFB6BC00E26E29 254 | 255 | fileRef 256 | 93F45D7A18AFB6BC00E26E29 257 | isa 258 | PBXBuildFile 259 | 260 | 93F45D7C18AFB6BC00E26E29 261 | 262 | isa 263 | PBXFileReference 264 | lastKnownFileType 265 | wrapper.framework 266 | name 267 | CoreGraphics.framework 268 | path 269 | System/Library/Frameworks/CoreGraphics.framework 270 | sourceTree 271 | SDKROOT 272 | 273 | 93F45D7D18AFB6BC00E26E29 274 | 275 | fileRef 276 | 93F45D7C18AFB6BC00E26E29 277 | isa 278 | PBXBuildFile 279 | 280 | 93F45D7E18AFB6BC00E26E29 281 | 282 | isa 283 | PBXFileReference 284 | lastKnownFileType 285 | wrapper.framework 286 | name 287 | UIKit.framework 288 | path 289 | System/Library/Frameworks/UIKit.framework 290 | sourceTree 291 | SDKROOT 292 | 293 | 93F45D7F18AFB6BC00E26E29 294 | 295 | fileRef 296 | 93F45D7E18AFB6BC00E26E29 297 | isa 298 | PBXBuildFile 299 | 300 | 93F45D8018AFB6BC00E26E29 301 | 302 | children 303 | 304 | 93F45D8918AFB6BC00E26E29 305 | 93F45D8A18AFB6BC00E26E29 306 | 93F45D8C18AFB6BC00E26E29 307 | 93F45D8F18AFB6BC00E26E29 308 | 93F45D9018AFB6BC00E26E29 309 | 93F45D9218AFB6BC00E26E29 310 | 93F45D8118AFB6BC00E26E29 311 | 312 | isa 313 | PBXGroup 314 | path 315 | MQTTExample 316 | sourceTree 317 | <group> 318 | 319 | 93F45D8118AFB6BC00E26E29 320 | 321 | children 322 | 323 | 93F45D8218AFB6BC00E26E29 324 | 93F45D8318AFB6BC00E26E29 325 | 93F45D8618AFB6BC00E26E29 326 | 93F45D8818AFB6BC00E26E29 327 | 328 | isa 329 | PBXGroup 330 | name 331 | Supporting Files 332 | sourceTree 333 | <group> 334 | 335 | 93F45D8218AFB6BC00E26E29 336 | 337 | isa 338 | PBXFileReference 339 | lastKnownFileType 340 | text.plist.xml 341 | path 342 | MQTTExample-Info.plist 343 | sourceTree 344 | <group> 345 | 346 | 93F45D8318AFB6BC00E26E29 347 | 348 | children 349 | 350 | 93F45D8418AFB6BC00E26E29 351 | 352 | isa 353 | PBXVariantGroup 354 | name 355 | InfoPlist.strings 356 | sourceTree 357 | <group> 358 | 359 | 93F45D8418AFB6BC00E26E29 360 | 361 | isa 362 | PBXFileReference 363 | lastKnownFileType 364 | text.plist.strings 365 | name 366 | en 367 | path 368 | en.lproj/InfoPlist.strings 369 | sourceTree 370 | <group> 371 | 372 | 93F45D8518AFB6BC00E26E29 373 | 374 | fileRef 375 | 93F45D8318AFB6BC00E26E29 376 | isa 377 | PBXBuildFile 378 | 379 | 93F45D8618AFB6BC00E26E29 380 | 381 | isa 382 | PBXFileReference 383 | lastKnownFileType 384 | sourcecode.c.objc 385 | path 386 | main.m 387 | sourceTree 388 | <group> 389 | 390 | 93F45D8718AFB6BC00E26E29 391 | 392 | fileRef 393 | 93F45D8618AFB6BC00E26E29 394 | isa 395 | PBXBuildFile 396 | 397 | 93F45D8818AFB6BC00E26E29 398 | 399 | isa 400 | PBXFileReference 401 | lastKnownFileType 402 | sourcecode.c.h 403 | path 404 | MQTTExample-Prefix.pch 405 | sourceTree 406 | <group> 407 | 408 | 93F45D8918AFB6BC00E26E29 409 | 410 | isa 411 | PBXFileReference 412 | lastKnownFileType 413 | sourcecode.c.h 414 | path 415 | MQTTAppDelegate.h 416 | sourceTree 417 | <group> 418 | 419 | 93F45D8A18AFB6BC00E26E29 420 | 421 | isa 422 | PBXFileReference 423 | lastKnownFileType 424 | sourcecode.c.objc 425 | path 426 | MQTTAppDelegate.m 427 | sourceTree 428 | <group> 429 | 430 | 93F45D8B18AFB6BC00E26E29 431 | 432 | fileRef 433 | 93F45D8A18AFB6BC00E26E29 434 | isa 435 | PBXBuildFile 436 | 437 | 93F45D8C18AFB6BC00E26E29 438 | 439 | children 440 | 441 | 93F45D8D18AFB6BC00E26E29 442 | 443 | isa 444 | PBXVariantGroup 445 | name 446 | Main.storyboard 447 | sourceTree 448 | <group> 449 | 450 | 93F45D8D18AFB6BC00E26E29 451 | 452 | isa 453 | PBXFileReference 454 | lastKnownFileType 455 | file.storyboard 456 | name 457 | Base 458 | path 459 | Base.lproj/Main.storyboard 460 | sourceTree 461 | <group> 462 | 463 | 93F45D8E18AFB6BC00E26E29 464 | 465 | fileRef 466 | 93F45D8C18AFB6BC00E26E29 467 | isa 468 | PBXBuildFile 469 | 470 | 93F45D8F18AFB6BC00E26E29 471 | 472 | isa 473 | PBXFileReference 474 | lastKnownFileType 475 | sourcecode.c.h 476 | path 477 | MQTTViewController.h 478 | sourceTree 479 | <group> 480 | 481 | 93F45D9018AFB6BC00E26E29 482 | 483 | isa 484 | PBXFileReference 485 | lastKnownFileType 486 | sourcecode.c.objc 487 | path 488 | MQTTViewController.m 489 | sourceTree 490 | <group> 491 | 492 | 93F45D9118AFB6BC00E26E29 493 | 494 | fileRef 495 | 93F45D9018AFB6BC00E26E29 496 | isa 497 | PBXBuildFile 498 | 499 | 93F45D9218AFB6BC00E26E29 500 | 501 | isa 502 | PBXFileReference 503 | lastKnownFileType 504 | folder.assetcatalog 505 | path 506 | Images.xcassets 507 | sourceTree 508 | <group> 509 | 510 | 93F45D9318AFB6BC00E26E29 511 | 512 | fileRef 513 | 93F45D9218AFB6BC00E26E29 514 | isa 515 | PBXBuildFile 516 | 517 | 93F45D9418AFB6BC00E26E29 518 | 519 | buildActionMask 520 | 2147483647 521 | files 522 | 523 | 93F45DA618AFB6BC00E26E29 524 | 525 | isa 526 | PBXSourcesBuildPhase 527 | runOnlyForDeploymentPostprocessing 528 | 0 529 | 530 | 93F45D9518AFB6BC00E26E29 531 | 532 | buildActionMask 533 | 2147483647 534 | files 535 | 536 | 93F45D9A18AFB6BC00E26E29 537 | 93F45D9C18AFB6BC00E26E29 538 | 93F45D9B18AFB6BC00E26E29 539 | 540 | isa 541 | PBXFrameworksBuildPhase 542 | runOnlyForDeploymentPostprocessing 543 | 0 544 | 545 | 93F45D9618AFB6BC00E26E29 546 | 547 | buildActionMask 548 | 2147483647 549 | files 550 | 551 | 93F45DA418AFB6BC00E26E29 552 | 553 | isa 554 | PBXResourcesBuildPhase 555 | runOnlyForDeploymentPostprocessing 556 | 0 557 | 558 | 93F45D9718AFB6BC00E26E29 559 | 560 | buildConfigurationList 561 | 93F45DAC18AFB6BC00E26E29 562 | buildPhases 563 | 564 | 93F45D9418AFB6BC00E26E29 565 | 93F45D9518AFB6BC00E26E29 566 | 93F45D9618AFB6BC00E26E29 567 | 568 | buildRules 569 | 570 | dependencies 571 | 572 | 93F45D9E18AFB6BC00E26E29 573 | 574 | isa 575 | PBXNativeTarget 576 | name 577 | MQTTExampleTests 578 | productName 579 | MQTTExampleTests 580 | productReference 581 | 93F45D9818AFB6BC00E26E29 582 | productType 583 | com.apple.product-type.bundle.unit-test 584 | 585 | 93F45D9818AFB6BC00E26E29 586 | 587 | explicitFileType 588 | wrapper.cfbundle 589 | includeInIndex 590 | 0 591 | isa 592 | PBXFileReference 593 | path 594 | MQTTExampleTests.xctest 595 | sourceTree 596 | BUILT_PRODUCTS_DIR 597 | 598 | 93F45D9918AFB6BC00E26E29 599 | 600 | isa 601 | PBXFileReference 602 | lastKnownFileType 603 | wrapper.framework 604 | name 605 | XCTest.framework 606 | path 607 | Library/Frameworks/XCTest.framework 608 | sourceTree 609 | DEVELOPER_DIR 610 | 611 | 93F45D9A18AFB6BC00E26E29 612 | 613 | fileRef 614 | 93F45D9918AFB6BC00E26E29 615 | isa 616 | PBXBuildFile 617 | 618 | 93F45D9B18AFB6BC00E26E29 619 | 620 | fileRef 621 | 93F45D7A18AFB6BC00E26E29 622 | isa 623 | PBXBuildFile 624 | 625 | 93F45D9C18AFB6BC00E26E29 626 | 627 | fileRef 628 | 93F45D7E18AFB6BC00E26E29 629 | isa 630 | PBXBuildFile 631 | 632 | 93F45D9D18AFB6BC00E26E29 633 | 634 | containerPortal 635 | 93F45D6F18AFB6BC00E26E29 636 | isa 637 | PBXContainerItemProxy 638 | proxyType 639 | 1 640 | remoteGlobalIDString 641 | 93F45D7618AFB6BC00E26E29 642 | remoteInfo 643 | MQTTExample 644 | 645 | 93F45D9E18AFB6BC00E26E29 646 | 647 | isa 648 | PBXTargetDependency 649 | target 650 | 93F45D7618AFB6BC00E26E29 651 | targetProxy 652 | 93F45D9D18AFB6BC00E26E29 653 | 654 | 93F45D9F18AFB6BC00E26E29 655 | 656 | children 657 | 658 | 93F45DA518AFB6BC00E26E29 659 | 93F45DA018AFB6BC00E26E29 660 | 661 | isa 662 | PBXGroup 663 | path 664 | MQTTExampleTests 665 | sourceTree 666 | <group> 667 | 668 | 93F45DA018AFB6BC00E26E29 669 | 670 | children 671 | 672 | 93F45DA118AFB6BC00E26E29 673 | 93F45DA218AFB6BC00E26E29 674 | 675 | isa 676 | PBXGroup 677 | name 678 | Supporting Files 679 | sourceTree 680 | <group> 681 | 682 | 93F45DA118AFB6BC00E26E29 683 | 684 | isa 685 | PBXFileReference 686 | lastKnownFileType 687 | text.plist.xml 688 | path 689 | MQTTExampleTests-Info.plist 690 | sourceTree 691 | <group> 692 | 693 | 93F45DA218AFB6BC00E26E29 694 | 695 | children 696 | 697 | 93F45DA318AFB6BC00E26E29 698 | 699 | isa 700 | PBXVariantGroup 701 | name 702 | InfoPlist.strings 703 | sourceTree 704 | <group> 705 | 706 | 93F45DA318AFB6BC00E26E29 707 | 708 | isa 709 | PBXFileReference 710 | lastKnownFileType 711 | text.plist.strings 712 | name 713 | en 714 | path 715 | en.lproj/InfoPlist.strings 716 | sourceTree 717 | <group> 718 | 719 | 93F45DA418AFB6BC00E26E29 720 | 721 | fileRef 722 | 93F45DA218AFB6BC00E26E29 723 | isa 724 | PBXBuildFile 725 | 726 | 93F45DA518AFB6BC00E26E29 727 | 728 | isa 729 | PBXFileReference 730 | lastKnownFileType 731 | sourcecode.c.objc 732 | path 733 | MQTTExampleTests.m 734 | sourceTree 735 | <group> 736 | 737 | 93F45DA618AFB6BC00E26E29 738 | 739 | fileRef 740 | 93F45DA518AFB6BC00E26E29 741 | isa 742 | PBXBuildFile 743 | 744 | 93F45DA718AFB6BC00E26E29 745 | 746 | buildSettings 747 | 748 | ALWAYS_SEARCH_USER_PATHS 749 | NO 750 | ARCHS 751 | $(ARCHS_STANDARD_INCLUDING_64_BIT) 752 | CLANG_CXX_LANGUAGE_STANDARD 753 | gnu++0x 754 | CLANG_CXX_LIBRARY 755 | libc++ 756 | CLANG_ENABLE_MODULES 757 | YES 758 | CLANG_ENABLE_OBJC_ARC 759 | YES 760 | CLANG_WARN_BOOL_CONVERSION 761 | YES 762 | CLANG_WARN_CONSTANT_CONVERSION 763 | YES 764 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE 765 | YES_ERROR 766 | CLANG_WARN_EMPTY_BODY 767 | YES 768 | CLANG_WARN_ENUM_CONVERSION 769 | YES 770 | CLANG_WARN_INT_CONVERSION 771 | YES 772 | CLANG_WARN_OBJC_ROOT_CLASS 773 | YES_ERROR 774 | CLANG_WARN__DUPLICATE_METHOD_MATCH 775 | YES 776 | CODE_SIGN_IDENTITY[sdk=iphoneos*] 777 | iPhone Developer 778 | COPY_PHASE_STRIP 779 | NO 780 | GCC_C_LANGUAGE_STANDARD 781 | gnu99 782 | GCC_DYNAMIC_NO_PIC 783 | NO 784 | GCC_OPTIMIZATION_LEVEL 785 | 0 786 | GCC_PREPROCESSOR_DEFINITIONS 787 | 788 | DEBUG=1 789 | $(inherited) 790 | 791 | GCC_SYMBOLS_PRIVATE_EXTERN 792 | NO 793 | GCC_WARN_64_TO_32_BIT_CONVERSION 794 | YES 795 | GCC_WARN_ABOUT_RETURN_TYPE 796 | YES_ERROR 797 | GCC_WARN_UNDECLARED_SELECTOR 798 | YES 799 | GCC_WARN_UNINITIALIZED_AUTOS 800 | YES 801 | GCC_WARN_UNUSED_FUNCTION 802 | YES 803 | GCC_WARN_UNUSED_VARIABLE 804 | YES 805 | IPHONEOS_DEPLOYMENT_TARGET 806 | 7.0 807 | ONLY_ACTIVE_ARCH 808 | YES 809 | SDKROOT 810 | iphoneos 811 | 812 | isa 813 | XCBuildConfiguration 814 | name 815 | Debug 816 | 817 | 93F45DA818AFB6BC00E26E29 818 | 819 | buildSettings 820 | 821 | ALWAYS_SEARCH_USER_PATHS 822 | NO 823 | ARCHS 824 | $(ARCHS_STANDARD_INCLUDING_64_BIT) 825 | CLANG_CXX_LANGUAGE_STANDARD 826 | gnu++0x 827 | CLANG_CXX_LIBRARY 828 | libc++ 829 | CLANG_ENABLE_MODULES 830 | YES 831 | CLANG_ENABLE_OBJC_ARC 832 | YES 833 | CLANG_WARN_BOOL_CONVERSION 834 | YES 835 | CLANG_WARN_CONSTANT_CONVERSION 836 | YES 837 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE 838 | YES_ERROR 839 | CLANG_WARN_EMPTY_BODY 840 | YES 841 | CLANG_WARN_ENUM_CONVERSION 842 | YES 843 | CLANG_WARN_INT_CONVERSION 844 | YES 845 | CLANG_WARN_OBJC_ROOT_CLASS 846 | YES_ERROR 847 | CLANG_WARN__DUPLICATE_METHOD_MATCH 848 | YES 849 | CODE_SIGN_IDENTITY[sdk=iphoneos*] 850 | iPhone Developer 851 | COPY_PHASE_STRIP 852 | YES 853 | ENABLE_NS_ASSERTIONS 854 | NO 855 | GCC_C_LANGUAGE_STANDARD 856 | gnu99 857 | GCC_WARN_64_TO_32_BIT_CONVERSION 858 | YES 859 | GCC_WARN_ABOUT_RETURN_TYPE 860 | YES_ERROR 861 | GCC_WARN_UNDECLARED_SELECTOR 862 | YES 863 | GCC_WARN_UNINITIALIZED_AUTOS 864 | YES 865 | GCC_WARN_UNUSED_FUNCTION 866 | YES 867 | GCC_WARN_UNUSED_VARIABLE 868 | YES 869 | IPHONEOS_DEPLOYMENT_TARGET 870 | 7.0 871 | SDKROOT 872 | iphoneos 873 | VALIDATE_PRODUCT 874 | YES 875 | 876 | isa 877 | XCBuildConfiguration 878 | name 879 | Release 880 | 881 | 93F45DA918AFB6BC00E26E29 882 | 883 | buildConfigurations 884 | 885 | 93F45DAA18AFB6BC00E26E29 886 | 93F45DAB18AFB6BC00E26E29 887 | 888 | defaultConfigurationIsVisible 889 | 0 890 | isa 891 | XCConfigurationList 892 | 893 | 93F45DAA18AFB6BC00E26E29 894 | 895 | baseConfigurationReference 896 | F7CD9C58F3014E348414E982 897 | buildSettings 898 | 899 | ASSETCATALOG_COMPILER_APPICON_NAME 900 | AppIcon 901 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME 902 | LaunchImage 903 | GCC_PRECOMPILE_PREFIX_HEADER 904 | YES 905 | GCC_PREFIX_HEADER 906 | MQTTExample/MQTTExample-Prefix.pch 907 | INFOPLIST_FILE 908 | MQTTExample/MQTTExample-Info.plist 909 | PRODUCT_NAME 910 | $(TARGET_NAME) 911 | WRAPPER_EXTENSION 912 | app 913 | 914 | isa 915 | XCBuildConfiguration 916 | name 917 | Debug 918 | 919 | 93F45DAB18AFB6BC00E26E29 920 | 921 | baseConfigurationReference 922 | F7CD9C58F3014E348414E982 923 | buildSettings 924 | 925 | ASSETCATALOG_COMPILER_APPICON_NAME 926 | AppIcon 927 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME 928 | LaunchImage 929 | GCC_PRECOMPILE_PREFIX_HEADER 930 | YES 931 | GCC_PREFIX_HEADER 932 | MQTTExample/MQTTExample-Prefix.pch 933 | INFOPLIST_FILE 934 | MQTTExample/MQTTExample-Info.plist 935 | PRODUCT_NAME 936 | $(TARGET_NAME) 937 | WRAPPER_EXTENSION 938 | app 939 | 940 | isa 941 | XCBuildConfiguration 942 | name 943 | Release 944 | 945 | 93F45DAC18AFB6BC00E26E29 946 | 947 | buildConfigurations 948 | 949 | 93F45DAD18AFB6BC00E26E29 950 | 93F45DAE18AFB6BC00E26E29 951 | 952 | defaultConfigurationIsVisible 953 | 0 954 | isa 955 | XCConfigurationList 956 | 957 | 93F45DAD18AFB6BC00E26E29 958 | 959 | buildSettings 960 | 961 | ARCHS 962 | $(ARCHS_STANDARD_INCLUDING_64_BIT) 963 | BUNDLE_LOADER 964 | $(BUILT_PRODUCTS_DIR)/MQTTExample.app/MQTTExample 965 | FRAMEWORK_SEARCH_PATHS 966 | 967 | $(SDKROOT)/Developer/Library/Frameworks 968 | $(inherited) 969 | $(DEVELOPER_FRAMEWORKS_DIR) 970 | 971 | GCC_PRECOMPILE_PREFIX_HEADER 972 | YES 973 | GCC_PREFIX_HEADER 974 | MQTTExample/MQTTExample-Prefix.pch 975 | GCC_PREPROCESSOR_DEFINITIONS 976 | 977 | DEBUG=1 978 | $(inherited) 979 | 980 | INFOPLIST_FILE 981 | MQTTExampleTests/MQTTExampleTests-Info.plist 982 | PRODUCT_NAME 983 | $(TARGET_NAME) 984 | TEST_HOST 985 | $(BUNDLE_LOADER) 986 | WRAPPER_EXTENSION 987 | xctest 988 | 989 | isa 990 | XCBuildConfiguration 991 | name 992 | Debug 993 | 994 | 93F45DAE18AFB6BC00E26E29 995 | 996 | buildSettings 997 | 998 | ARCHS 999 | $(ARCHS_STANDARD_INCLUDING_64_BIT) 1000 | BUNDLE_LOADER 1001 | $(BUILT_PRODUCTS_DIR)/MQTTExample.app/MQTTExample 1002 | FRAMEWORK_SEARCH_PATHS 1003 | 1004 | $(SDKROOT)/Developer/Library/Frameworks 1005 | $(inherited) 1006 | $(DEVELOPER_FRAMEWORKS_DIR) 1007 | 1008 | GCC_PRECOMPILE_PREFIX_HEADER 1009 | YES 1010 | GCC_PREFIX_HEADER 1011 | MQTTExample/MQTTExample-Prefix.pch 1012 | INFOPLIST_FILE 1013 | MQTTExampleTests/MQTTExampleTests-Info.plist 1014 | PRODUCT_NAME 1015 | $(TARGET_NAME) 1016 | TEST_HOST 1017 | $(BUNDLE_LOADER) 1018 | WRAPPER_EXTENSION 1019 | xctest 1020 | 1021 | isa 1022 | XCBuildConfiguration 1023 | name 1024 | Release 1025 | 1026 | 9E073BF4FA5440CE84D8C24A 1027 | 1028 | explicitFileType 1029 | archive.ar 1030 | includeInIndex 1031 | 0 1032 | isa 1033 | PBXFileReference 1034 | path 1035 | libPods.a 1036 | sourceTree 1037 | BUILT_PRODUCTS_DIR 1038 | 1039 | AF4506CA3A1447D8B72C03B6 1040 | 1041 | buildActionMask 1042 | 2147483647 1043 | files 1044 | 1045 | inputPaths 1046 | 1047 | isa 1048 | PBXShellScriptBuildPhase 1049 | name 1050 | Check Pods Manifest.lock 1051 | outputPaths 1052 | 1053 | runOnlyForDeploymentPostprocessing 1054 | 0 1055 | shellPath 1056 | /bin/sh 1057 | shellScript 1058 | diff "${PODS_ROOT}/../Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null 1059 | if [[ $? != 0 ]] ; then 1060 | cat << EOM 1061 | error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation. 1062 | EOM 1063 | exit 1 1064 | fi 1065 | 1066 | showEnvVarsInLog 1067 | 0 1068 | 1069 | F7CD9C58F3014E348414E982 1070 | 1071 | includeInIndex 1072 | 1 1073 | isa 1074 | PBXFileReference 1075 | lastKnownFileType 1076 | text.xcconfig 1077 | name 1078 | Pods.xcconfig 1079 | path 1080 | Pods/Pods.xcconfig 1081 | sourceTree 1082 | <group> 1083 | 1084 | 1085 | rootObject 1086 | 93F45D6F18AFB6BC00E26E29 1087 | 1088 | 1089 | -------------------------------------------------------------------------------- /MQTTExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /MQTTExample.xcodeproj/xcshareddata/xcschemes/MQTTExample.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 61 | 62 | 68 | 69 | 70 | 71 | 72 | 73 | 79 | 80 | 86 | 87 | 88 | 89 | 91 | 92 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /MQTTExample.xcodeproj/xcuserdata/jmesnil.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | MQTTExample.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 93F45D7618AFB6BC00E26E29 16 | 17 | primary 18 | 19 | 20 | 93F45D9718AFB6BC00E26E29 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /MQTTExample/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 26 | 32 | 33 | 34 | 35 | 36 | 43 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /MQTTExample/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "40x40", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "60x60", 16 | "scale" : "2x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /MQTTExample/Images.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "orientation" : "portrait", 5 | "idiom" : "iphone", 6 | "extent" : "full-screen", 7 | "minimum-system-version" : "7.0", 8 | "scale" : "2x" 9 | }, 10 | { 11 | "orientation" : "portrait", 12 | "idiom" : "iphone", 13 | "subtype" : "retina4", 14 | "extent" : "full-screen", 15 | "minimum-system-version" : "7.0", 16 | "scale" : "2x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /MQTTExample/MQTTAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // MQTTAppDelegate.h 3 | // MQTTExample 4 | // 5 | // Created by Jeff Mesnil on 15/02/2014. 6 | // Copyright (c) 2014 jmesnil.net. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface MQTTAppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /MQTTExample/MQTTAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // MQTTAppDelegate.m 3 | // MQTTExample 4 | // 5 | // Created by Jeff Mesnil on 15/02/2014. 6 | // Copyright (c) 2014 jmesnil.net. All rights reserved. 7 | // 8 | 9 | #import "MQTTAppDelegate.h" 10 | 11 | @implementation MQTTAppDelegate 12 | 13 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 14 | { 15 | // Override point for customization after application launch. 16 | return YES; 17 | } 18 | 19 | - (void)applicationWillResignActive:(UIApplication *)application 20 | { 21 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 22 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 23 | } 24 | 25 | - (void)applicationDidEnterBackground:(UIApplication *)application 26 | { 27 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 28 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 29 | } 30 | 31 | - (void)applicationWillEnterForeground:(UIApplication *)application 32 | { 33 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 34 | } 35 | 36 | - (void)applicationDidBecomeActive:(UIApplication *)application 37 | { 38 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 39 | } 40 | 41 | - (void)applicationWillTerminate:(UIApplication *)application 42 | { 43 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 44 | } 45 | 46 | @end 47 | -------------------------------------------------------------------------------- /MQTTExample/MQTTExample-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIdentifier 12 | net.jmesnil.${PRODUCT_NAME:rfc1034identifier} 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0 25 | LSRequiresIPhoneOS 26 | 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /MQTTExample/MQTTExample-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header 3 | // 4 | // The contents of this file are implicitly included at the beginning of every source file. 5 | // 6 | 7 | #import 8 | 9 | #ifndef __IPHONE_5_0 10 | #warning "This project uses features only available in iOS SDK 5.0 and later." 11 | #endif 12 | 13 | #ifdef __OBJC__ 14 | #import 15 | #import 16 | #endif 17 | -------------------------------------------------------------------------------- /MQTTExample/MQTTViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // MQTTViewController.h 3 | // MQTTExample 4 | // 5 | // Created by Jeff Mesnil on 15/02/2014. 6 | // Copyright (c) 2014 jmesnil.net. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface MQTTViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /MQTTExample/MQTTViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // MQTTViewController.m 3 | // MQTTExample 4 | // 5 | // Created by Jeff Mesnil on 15/02/2014. 6 | // Copyright (c) 2014 jmesnil.net. All rights reserved. 7 | // 8 | 9 | #import "MQTTViewController.h" 10 | #import 11 | 12 | #define kMQTTServerHost @"iot.eclipse.org" 13 | #define kTopic @"MQTTExample/LED" 14 | 15 | @interface MQTTViewController () 16 | 17 | // this UISwitch will be used to display the status received from the topic. 18 | @property (weak, nonatomic) IBOutlet UISwitch *subscribedSwitch; 19 | 20 | // create a property for the MQTTClient that is used to send and receive the message 21 | @property (nonatomic, strong) MQTTClient *client; 22 | 23 | @end 24 | 25 | @implementation MQTTViewController 26 | 27 | - (void)viewDidLoad 28 | { 29 | [super viewDidLoad]; 30 | 31 | // create the MQTT client with an unique identifier 32 | NSString *clientID = [UIDevice currentDevice].identifierForVendor.UUIDString; 33 | self.client = [[MQTTClient alloc] initWithClientId:clientID]; 34 | 35 | // keep a reference on the switch to avoid having a reference to self in the 36 | // block below (retain/release cycle, blah blah blah) 37 | UISwitch *subSwitch = self.subscribedSwitch; 38 | 39 | // define the handler that will be called when MQTT messages are received by the client 40 | [self.client setMessageHandler:^(MQTTMessage *message) { 41 | // extract the switch status from the message payload 42 | BOOL on = [message.payloadString boolValue]; 43 | 44 | // the MQTTClientDelegate methods are called from a GCD queue. 45 | // Any update to the UI must be done on the main queue 46 | dispatch_async(dispatch_get_main_queue(), ^{ 47 | [subSwitch setOn:on animated:YES]; 48 | }); 49 | }]; 50 | 51 | // connect the MQTT client 52 | [self.client connectToHost:kMQTTServerHost completionHandler:^(MQTTConnectionReturnCode code) { 53 | if (code == ConnectionAccepted) { 54 | // The client is connected when this completion handler is called 55 | NSLog(@"client is connected with id %@", clientID); 56 | // Subscribe to the topic 57 | [self.client subscribe:kTopic withCompletionHandler:^(NSArray *grantedQos) { 58 | // The client is effectively subscribed to the topic when this completion handler is called 59 | NSLog(@"subscribed to topic %@", kTopic); 60 | }]; 61 | } 62 | }]; 63 | } 64 | 65 | - (void)dealloc 66 | { 67 | // disconnect the MQTT client 68 | [self.client disconnectWithCompletionHandler:^(NSUInteger code) { 69 | // The client is disconnected when this completion handler is called 70 | NSLog(@"MQTT is disconnected"); 71 | }]; 72 | } 73 | 74 | #pragma mark - IBActions 75 | 76 | // This method is called when the "published LED" switch status changes 77 | - (IBAction)switchUpdated:(id)sender { 78 | BOOL on = [sender isOn]; 79 | NSString *payload = [NSNumber numberWithBool:on].stringValue; 80 | 81 | // use the MQTT client to send a message with the switch status to the topic 82 | [self.client publishString:payload 83 | toTopic:kTopic 84 | withQos:AtMostOnce 85 | retain:YES 86 | completionHandler:nil]; 87 | // we passed nil to the completionHandler as we are not interested to know 88 | // when the message was effectively sent 89 | } 90 | 91 | @end 92 | -------------------------------------------------------------------------------- /MQTTExample/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /MQTTExample/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // MQTTExample 4 | // 5 | // Created by Jeff Mesnil on 15/02/2014. 6 | // Copyright (c) 2014 jmesnil.net. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "MQTTAppDelegate.h" 12 | 13 | int main(int argc, char * argv[]) 14 | { 15 | @autoreleasepool { 16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([MQTTAppDelegate class])); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /MQTTExampleTests/MQTTExampleTests-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | net.jmesnil.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 1.0 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /MQTTExampleTests/MQTTExampleTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // MQTTExampleTests.m 3 | // MQTTExampleTests 4 | // 5 | // Created by Jeff Mesnil on 15/02/2014. 6 | // Copyright (c) 2014 jmesnil.net. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface MQTTExampleTests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation MQTTExampleTests 16 | 17 | - (void)setUp 18 | { 19 | [super setUp]; 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | } 22 | 23 | - (void)tearDown 24 | { 25 | // Put teardown code here. This method is called after the invocation of each test method in the class. 26 | [super tearDown]; 27 | } 28 | 29 | - (void)testExample 30 | { 31 | XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__); 32 | } 33 | 34 | @end 35 | -------------------------------------------------------------------------------- /MQTTExampleTests/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | xcodeproj 'MQTTExample.xcodeproj' 2 | 3 | pod 'MQTTKit', :git => 'https://github.com/jmesnil/MQTTKit.git' 4 | 5 | platform :ios, '5.0' 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | MQTTExample 2 | =========== 3 | 4 | 5 | [![Build Status](https://travis-ci.org/jmesnil/MQTTExample.png?branch=master)](https://travis-ci.org/jmesnil/MQTTExample) 6 | 7 | iOS example application using [MQTTKit](https://github.com/jmesnil/MQTTKit) to send and recive [MQTT](http://mqtt.org) messages. 8 | 9 | ![Screenshot of the MQTTExample application](./screenshot.png) 10 | 11 | # Usage 12 | 13 | Run ```pod install``` to insall the dependencies (including MQTTKit) 14 | and open `MQTTExample.xcworkpace` to build and run the example. 15 | 16 | The app will connect to the MQTT broker hosted at [`iot.eclipse.org`](http://iot.eclipse.org/) and publish messages on the `/MQTTExample/LED` topic. 17 | 18 | The retained message for this topic can be seen at http://eclipse.mqttbridge.com/%2FMQTTExample%2FLED 19 | 20 | It is possible to change the state of the LED by publishing messages using eclipse's MQTT bridge: 21 | 22 | * switch __on__ the subscribed LED: 23 | 24 | 25 | curl -X PUT --data-binary "1" http://eclipse.mqttbridge.com/%2FMQTTExample%2FLED 26 | 27 | 28 | * switch __off__ the subscribed LED: 29 | 30 | 31 | curl -X PUT --data-binary "0" http://eclipse.mqttbridge.com/%2FMQTTExample%2FLED 32 | 33 | 34 | Noe that if you used these HTTP calls to change the LED state, the published LED will not necessarily be in the same state than the subscribed LED. 35 | 36 | 37 | # Code 38 | 39 | The whole code to send and receive MQTT message is in [MQTTViewController.m](MQTTExample/MQTTViewController.m). 40 | -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jmesnil/MQTTExample/50522e385c73ec197eaeb9011a761b4b646aad0b/screenshot.png --------------------------------------------------------------------------------