├── .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 | [](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 | 
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
--------------------------------------------------------------------------------